业务的高速发展,对系统稳定性提出了更高的要求,各个系统每天产生大量的日志,你是否曾担心过:
- 系统有潜在异常,但被淹没在海量日志中
- 机器被入侵,有异常登录,却后知后觉
- 新版本上线,系统行为有变化,却无法感知
这些问题,归根到底,是信息太多、太杂,不能良好归类,同时记录信息的日志,往往还都是无Schema,格式多样,归类难道更大。
现在日志服务,提供实时日志智能聚类(LogReduce)功能,根据日志的相似性进行归类,快速掌握日志全貌,主要功能和特性:
- 支持任意格式日志:Log4J、Json、单行(syslog)
- 亿级数据,秒级出结果
- 日志经任意条件过滤后再Reduce
- 对Reduce后Pattern,根据signature反查原始数据
- 不同时间段Pattern比较
- 动态调整Reduce精度
主要应用场景:
- DevOps(问题定位、异常检测、版本回归等)
- 安全、入侵检测
- 审计
功能演示
接下来,我们以Devops场景为例,看看LogReduce如何快速定位应用故障。
排障实战
线上发生异常的时候,往往会打印大量的错误日志,在下图中,是系统请求堵塞情况下,系统记录的日志,短短5分钟记录了3千多万行错误日志,而图中的两个尖峰到底是哪些日志突涨引起的?发生异常的根源又是什么?
通常的处理方式,总是不停过滤,排除无关错误日志,如:
ERROR not WARNING not quota not InternalServerError not sync not RPCChannelBase.cpp not tcpcomponent.cpp not easy_connection.c
排查了N个条件后,发现出现了"queue full"的错误,而这只是一个表象,到底什么原因导致队列堵塞呢?看来,还需要再过滤排查。
然后,有了”日志聚类“功能后,只要一次点击,通过LogReduce快速聚类,结果一目了然:
- 最多的错误,是3000W+多条queue full,是堵塞的表象
- 其次,是写入quota超过限制的错误,和堵塞无关
- 接着,底层网络请求出现timeout,对于队列模型,大量的timeout很容易引起堵塞
- 最后,第四类日志pattern中,显示访问某个服务,获取worker访问地址出现timeout,从pattern中,可定位问题机器的ip和端,直接确定异常根源。
通过以上简单例子,可以看到,海量日志经LogReduce处理后,异常归类非常清楚,大大提高故障排查效率。
其他功能介绍
通过Pattern反查原始数据
在进行LogReduce时,相同pattern中变化部分(变量)会被"*" 号代替,SLS在进行reduce的时候,内部会为每条日志标记一个signature,通过signature可以反查原始日志, 如:
点击子Pattern count连接,查看原始日志。
Reduce精度动态调整
不同日志特征不尽相同,默认相似度计算,不一定能完全满足,可能导致聚类结果过于粗略或细节太多,在这种情况下,可以通过动态聚类精度,获取/隐藏更多细节。
Pattern对比
在新版本上线,往往希望知道,有哪些新出现的日志类别,哪类日志在数量上有明显的抖动,这样的版本回归对比需求,可以使用LogReduce + cmp来满足(控制台后续会提供LogCompare的专门页面)。
ERROR | select
v.signature,
v.pattern,
coalesce(v.cmp[1],0) as count_now,
coalesce(v.cmp[2],0) as count_before,
coalesce(v.cmp[1],0) - coalesce(v.cmp[2],0) as count_diff
from (
select
p.signature as signature ,
arbitrary(p.pattern) as pattern ,
compare(p.count,300) as cmp
from
(select log_reduce() as p from log) group by p.signature
)v order by count_diff desc
更多类型日志场景
Syslog
/var/log/messages作为系统核心日志文件,记录了系统运行时重要信息,如磁盘、网络、内存等各类硬件错误信息,也包括root权限执行的各命令,系统登录等重要事件,对于故障诊断、入侵检测都是首要关注的文件。
同时,也由于日志内容复杂多样,格式不统一,未过滤定义的事件,往往容易淹没在海量日志中。通过LogReduce,可快速合并相似pattern,发现异常事件。
如下图中,将几百万事件快速聚合成几十个Pattern后,一眼就能看到网卡异常信息。
Log4J日志
大量Java程序,使用Log4J记录日志,下图显示一个java应用的最近15分钟主要的错误日志分类。
Sql日志
从SQL的访问日志,可以过滤出延时超过一定阈值的日志,通过聚类后发现延时高的sql主要有2类,调查后发现,其中一类是数据库的索引没有正确设置导致。
通过以上样例可以发现,日志服务(SLS)提供的日志聚类功能,对于日志的样式无任何限制,只会根据日志相似性,提取出通用Pattern,快速获取日志的整体概览。
后记
围绕日志,挖掘其中更大价值,一直是我们团队所关注。在原有日志实时查询基础上,今年SLS在DevOps领域完善了上下文查询、实时Tail和智能聚类,以提高问题调查效率;同时在日志分析上,提供多种时序数据的异常检测和预测函数,来做更智能的检查和预测;最后,数据分析的结果,可以触发报警,并调用webhook进行关联行动。
在日志智能聚类上,后续我们计划:
- 根据Pattern的频率变化,结合机器学习算法,自动检测出异常Pattern
- 提供LogReduce cmp函数并集成在控制台,简化复杂sql的编写
- 加入反馈机制,如对reduce结果打分,以提高reduce的准确度
产品链接
http://www.aliyun.com/product/sls
用户交流群