日志系列--程序日志处理挑战与方案

程序日志(AppLog)有什么特点?

  • 内容最全:程序日志是由程序员给出,在重要的地点、变量数值以及异常都会有记录,可以说线上90%以上Bug都是依靠程序日志输出定位到
  • 格式比较随意:代码往往经过不同人开发,每个程序员都有自己爱好的格式,一般非常难进行统一,并且引入的一些第三方库的日志风格也不太一样
  • 有一定共性:虽然格式随意,但一般都会有一些共性的地方,例如对Log4J日志而言,会有如下几个字段是必须的:
    • 时间
    • 级别(Level)
    • 所在文件或类(file or class)
    • 行数(Line Number)
    • 线程号(ThreadId)

处理程序日志会有哪些挑战?

1. 数据量大

程序日志一般会比访问日志大1个数量级:假设一个网站一天有100W次独立访问,每个访问大约有20逻辑模块,在每个逻辑模块中有10个主要逻辑点需要记录日志。

则日志总数为:

100W  20  10 = 2 * 10^8 条

每条长度为200字节,则存储大小为

2  10^8  200 = 4 * 10^10 = 40 GB

这个数据会随着业务系统复杂变得更大,一天100-200GB日志对一个中型网站而言是很常见的。

2. 分布服务器多

大部分应用都是无状态模式,跑在不同框架中,例如:

  • 服务器
  • Docker(容器)
  • 函数计算(容器服务)

对应实例数目会从几个到几千,需要有一种跨服务器的日志采集方案

3. 运行环境复杂

程序会落到不同的环境上,例如:

  • 应用相关的会在容器中
  • API相关日志会在FunctionCompute中
  • 旧系统日志在传统IDC中
  • 移动端相关日志在用户处
  • 网页端(M站)在浏览器里

为了能够获得全貌,我们必须把所有数据统一并存储起来。

如何解决程序日志需求

1.统一存储

目标:要把各渠道数据采集到一个集中化中心,打通才可以做后续事情。

我们可以在日志服务中创建一个项目来存储应用日志,日志服务提供30+种日志采集手段:无论是在硬件服务器中埋点,还是网页端JS,或是服务器上输出日志,都可以在实时采集列表中找到。

在服务器日志上,除了使用SDK等直接写入外,日志服务提供便捷、稳定、高性能Agent-Logtail。logtail提供windows、linux两个版本,在控制台定义好机器组,日志采集配置后,就能够实时将服务日志进行采集,这里有一个5分钟视频。

在创建完成一个日志采集配置后,我们就可以在项目中操作各种日志了。

可能有人要问到,日志采集Agent非常多,有Logstash,Flume,FluentD,以及Beats等,Logtail和这些相比有什么特点吗?

  • 使用便捷:提供API、远程管理与监控功能,融入阿里集团百万级服务器日志采集管理经验,配置一个采集点到几十万设备只需要几秒钟
  • 适应各种环境:无论是公网、VPC、用户自定义IDC等都可以支持,https以及断点续传功能使得接入公网数据也不再话下
  • 性能强,对资源消耗非常小:经过多年磨练,在性能和资源消耗方面比开源要好,详见对比测试

2. 快速查找定位

目标:无论数据量如何增长、服务器如何部署,都可以保证定位问题时间是恒定的

例如有一个订单错误,一个延时很长,我们如何能够在一周几TB数据量日志中快速定位到问题。其中还会涉及到各种条件过滤和排查等。

  1. 例如我们对于程序中记录延时的日志,调查延时大于1秒,并且方法以Post开头的请求数据:
Latency > 1000000 and Method=Post*
  1. 对于日志中查找包含error关键词,不包含merge关键词的日志
  • 一天的结果

  • 一周的结果

  • 更长时间结果

    这些查询都是在不到1秒时间内可以返回

3. 关联分析

关联有两种类型,进程内关联与跨进程关联。我们先来看看两者有什么区别:

  • 进程内关联:一般比较简单,因为同一个函数前后日志都在一个文件中。在多线程环节中,我们只要根据线程Id进行过滤即可
  • 跨进程关联:跨进程的请求一般没有明确线索,一般会通过RPC中传入TracerId来进行关联

3.1 上下文关联

还是以使用日志服务控制台距离,线上通过关键词查询定位到一个异常日志:

点击上下文查询后,既跳转到前后N条上下文

  • 显示框可以通过“更早”、“更新”等按钮加载更多上下文
  • 也可以点击“返回普通搜索模式”进一步排查通过筛选框筛选ThreadID,进行精准上下文的过滤

更多上下文查询文档请参见文档索引查询下上下文查询

3.2 跨进程关联

跨进程关联也叫Tracing,最早的工作是Google在2010年的那篇著名“Dapper, a Large-Scale Distributed Systems Tracing Infrastructure”,之后开源界借鉴了Google思想做成过了平民化的各种Tracer版本。目前比较有名的有:

  • Dapper(Google): 各 tracer基础
  • StackDriver Trace (Google),现在兼容了ZipKin
  • Zipkin:twitter开源的Tracing系统
  • Appdash:golang版本
  • 鹰眼:阿里巴巴集团中间件技术技术部研发
  • X-ray:AWS在2016年Re:Invent上推出技术

如果从0开始使用Tracer会相对容易一些,但在现有系统中去使用,则会有改造的代价和挑战。

今天我们可以基于日志服务,实现一个基本Tracing功能:在各模块日志中输出Request_id, OrderId等可以关联的标示字段,通过在不同的日志库中查找,即可拿到所有相关的日志。

例如我们可以通过SDK查询 前端机,后端机,支付系统,订单系统等日志,拿到结果后做一个前端的页面将跨进程调用关联起来,以下就是基于日志服务快速搭建的Tracing系统。

4. 统计分析

查找到特点日志后,我们有时希望能做一些分析,例如线上有多少种不同类型的错误日志?

  1. 我们先通过对"__level__"这个日志级别字段进行查询,得知一天内有2720个错误:
__level__:error

  1. 接下来,我们可以根据file,line这两个字段(确定唯一的日志类型)来进行统计聚合

    __level__:error | select __file__, __line__, count(*) as c group by __file__, __line__ order by c desc

就能够拿到所有错误发生的类型和位置的分布了

其他还有诸如根据错误码、高延时等条件进行IP定位与分析等,更多可以参见访问日志分析案例。

5. 其他

1.备份日志审计

可以将日志备份至OSS或存储成本更低的IA,或直接到MaxCompute,详情参见日志投递

2.关键词报警

目前有如下方式可以进行报警
1. 在日志服务中将日志查询另存为一个定时任务,对结果进行报警,参见文档
2. 通过云监控日志报警功能,参见文档

3.日志查询权限分配管理

可以通过子账号+授权组方法隔离开发、PE等权限,参见文档

最后说一下价格与成本,程序日志主要会用到日志服务LogHub + LogSearch功能,这里有一个和开源方案对比,在查询成本上是开源方案25%,使用非常便捷,另你开发工作事半功倍。

时间: 2024-10-10 05:59:35

日志系列--程序日志处理挑战与方案的相关文章

Powershell使用WINDOWS事件日志记录程序日志_PowerShell

通常,人们使用基于文件的日志.这样做没有什么问题,但是使用WINDOWS提供系统内部日志会更加简单. 如果你有管理权限,你可以随时创建一个新的日志: 复制代码 代码如下: New-EventLog -LogName myLog -Source JobDue, JobDone, Remark 该命令创造了一个名为Mylog的日志,这个事件源自"JobDUE","JobDone"和"Remark".管理员权限只是为了创造日志,剩下的操作其它用户都可以

日志系列--计量日志处理方案

使用云服务最大好处是按量付费,无需预留资源,因此各云产品都有计量计费需求.这里我们介绍一种基于日志服务计量计费方案,该方案每天处理千亿级计量日志,被众多云产品使用: 计量日志生成计费结果过程 计量日志记录了用户涉及计费的项目,后台计费模块根据计费项和规则进行运算,产生最后账单.例如如下原始访问日志记录了项目(Project)使用情况: microtime:1457517269818107 Method:PostLogStoreLogs Status:200 Source:10.145.6.81

日志系列--账单日志的统计分析

简介 成交账单是电商公司的核心数据,是一系列营销和推广活动最终的转化成果.这些数据包含了很多有价值的信息:从这些数据出发,可以描绘出用户画像,为下一步的营销提供方向.账单数据还能提供货物的受欢迎程度,为下一步备货提供准备. 账单信息以日志的形式保存在阿里云日志服务上,日志服务能够提供快速的查询和SQL统计,在秒级别计算上亿条日志.本文将以几个例子来讲解如何挖掘有用信息. 一个完整的成交账单,包含了货物的信息(名称.价格).成交的价格信息(成交的价格.支付手段.优惠信息).交易对手的信息(会员信息

Serverless日志处理挑战与方案

本文PPT来自阿里云的简志于10月16日在2016年杭州云栖大会上发表的<Serverless日志处理挑战与方案>. 随着Serverless架构变得越来越流行,它不仅给研发与运营方面带来了便捷,同时也提出的新挑战,这是由于以下三个因素:1. 市场节奏变快,由卖方市场到买方市场成熟时间变短 2.云对技术影响大,运维转向运营,上线周期缩短 3.数据改变运营,需要收集百万用户行为,并实时提升游戏. 此外,由于Serverless架构同时影响了传统的计算与日志模式,所以Serverless也对日志处

日志系列-常见处理方案

什么是日志数据? "日志是一种简单的不能再简单的存储抽象".它是一个只能增加的,完全按照时间排序的一系列记录.日志(时间序列数据)看起来如下: 我们可以给日志末尾添加记录,并且可以从左到右读取日志记录.每一条记录都指定了一个唯一的有一定顺序的日志记录编号. 日志顺序由"时间"来确定,从图上可以看到日志从右到左的时间顺序,新产生的事件被记录,过去的事件渐渐远去,但它记录了什么时间发生了什么事情,这无论对于计算机.人类.还是整个世界而言,是认知与推理的基础. 日志数据有

Listen Software解决方案 “How To” 系列5:日志文件

解决  Listen Software解决方案 "How To" 系列5:日志文件 用实例管理器创建数据库(Oracle9i中已废除,故略去) 创建开发环境(略去)  日志文件  所有有关日志文件 重设日志选项 完成一个完整冷备份 1)创建一个数据库原形,在所有数据库文件的头部放入一个新的scn. 2)重设日志序列号到1 3)如果存在,重新格式化联机重做日志  无意恢复联机重做日志 当恢复数据库时,可能偶然地恢复联机重做日志.这将迫使完成一个不完全恢复而不是完全恢复.  状态和位置: 

WebSphere Application Server Community Edition中的应用程序日志记录

引言 应用程序日志记录提供了捕获在应用程序执行期间发生的各种事件的方法.它将收集关于应用程序在执行各种任务时在做什么的详细信息.此信息在调试.故障排除甚至审核方面很有用.WebSphere Application Server Community Edition(以下称为 Community Edition)提供了各种库,可帮助应用程序开发人员配置日志记录服务.这些库是: Log4j SLF4j java.util.logging java.util.logging 包是可用于所有标准 Java

浅谈程序日志

如果世界上有一个人能够保证一次写出来的代码是百分之百正确的,那么毫无疑问,他一定是世界上最优秀的程序员,没有之一.为什么要求代码写好过后要进行充分的自测 ( 包括单元测试和集成测试 ) ?就因为是人皆会犯错,使程序就会有 bug .作为一名软件开发人员,必须要学会对程序进行测试,也就是要学会程序的调试. 代码调试方法 一般而言,对代码的调试有以下几种方法: 第一,凭肉眼看 .在开发阶段,我们编写的每一行代码都需要用我们的"火眼金睛"多审查几遍.如果要问,最好的代码调试工具是什么?我认为

【大数据新手上路】“零基础”系列课程--日志服务(Log Service)采集 ECS 日志数据到 MaxCompute

随着公司业务的增多,云服务器 ECS 上的日志数据越来越多,存储开销越来越大,受限于日志的大小和格式,分析的速度非常缓慢,导致海量数据在沉睡,不知道发挥作用,如何能将这些数据进行归集.提炼和智能化的处理始终是一个困扰.通过日志服务投递日志数据到MaxCompute便可以让用户按照不同的场景和需求.以不同的方式复用数据,充分发挥日志数据的价值. 使用日志服务投递日志数据到MaxCompute具有如下优势: 使用非常简单.用户只需要完成2步配置即可以把日志服务Logstore的日志数据迁移到MaxC