基于Scheduled SQL的log4j日志异常事件过滤与分析

本文涉及的产品
对象存储 OSS,20GB 3个月
日志服务 SLS,月写入数据量 50GB 1个月
对象存储 OSS,恶意文件检测 1000次 1年
简介: 采用SLS提供的Scheduled SQL功能,对log4j ERROR日志进行处理并制作可视化报表

简介


日志可能是一种最简单的不能再简单的存储抽象,只能追加、按照时间完全有序(totally-ordered)的记录序列。作为项目开发必不可少的一部分,日志不仅可以帮助开发人员调试和优化系统,还可以是一种有价值的信息宝库,但是各系统混杂的日志如果不加以筛选和规范,就很难发挥其中的价值。

阿里云日志服务(SLS)是云原生观测分析平台,为Log/Metric/Trace等数据提供大规模、低成本、实时平台化服务。一站式提供数据采集、加工、分析、告警可视化与投递功能,全面提升研发、运维、运营和安全等场景数字化能力。

Scheduled SQL 是一项由 SLS 全托管的用于定时分析数据、存储聚合数据、投影与过滤数据的功能,简单来说就是:定时调度 + 查询分析解决场景需求包括:

  • 定时分析数据:根据业务需求设置 SQL 语句或查询分析语句,定时执行数据分析,并将分析结果存储到目标库中。
  • 全局聚合:对全量、细粒度的数据进行聚合存储,汇总为存储大小、精度适合的数据,相当于一定程度的有损压缩数据。

image

log4j简介


Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制程序日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接 口服务 器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。

最常用的是把日志信息输出到控制台和文件中,供开发人员进行调试和后续的系统分析。


常见的日志字段

  • 时间(日志产生的时间)
  • 日志级别(INFO、WARN、ERROR)
  • 日志信息产生的地点(在代码中的何处)
  • 日志信息
2021-10-12 08:47:15:733 [pool-4-thread-3] INFO test.log.LogMock.randomLog(LogMock.java:58) - send 1000 log to sls success
2021-10-12 08:47:15:485 [pool-4-thread-3] ERROR test.log.LogMock.randomLog(LogMock.java:64) - Error processing file web/2021/07/01/22/00_1625148042575442246_1435278095.snappy
com.aliyun.log.test.LogException: ErrorMessage: Write quota is exceeded. ErrorCode: 403
 at com.aliyun.log.ingest.core.producer.DefaultProducer.doSend(DefaultProducer.java:195) ~[sls-connect.jar:?]
 at com.aliyun.log.ingest.core.producer.DefaultProducer.send(DefaultProducer.java:100) ~[sls-connect.jar:?]
 at com.aliyun.log.ingest.core.AbstractSourceContext.collect(AbstractSourceContext.java:44) ~[sls-connect.jar:?]
 at com.aliyun.log.ingest.common.writer.RecordWriter.flush(RecordWriter.java:128) ~[sls-connect.jar:?]
 at com.aliyun.log.ingest.oss.processor.JSONReader.read(JSONReader.java:103) ~[sls-connect.jar:?]
 at com.aliyun.log.ingest.oss.processor.TextFileProcessor.parseAndEmitRecords(TextFileProcessor.java:101) ~[sls-connect.jar:?]
 at com.aliyun.log.ingest.oss.processor.TextFileProcessor.process(TextFileProcessor.java:63) [sls-connect.jar:?]
 at com.aliyun.log.ingest.oss.OSSTask.start(OSSTask.java:57) [sls-connect.jar:?]
 at com.aliyun.log.ingest.core.Worker.executeTask(Worker.java:90) [sls-connect.jar:?]
 at com.aliyun.log.ingest.core.Worker.executeTasks(Worker.java:124) [sls-connect.jar:?]
 at com.aliyun.log.ingest.core.Worker.execute(Worker.java:135) [sls-connect.jar:?]
 at com.aliyun.log.ingest.core.Worker.start(Worker.java:156) [sls-connect.jar:?]
 at com.aliyun.log.ingest.cli.WorkerStarter.main(WorkerStarter.java:51) [sls-connect.jar:?]
 ... 12 more

log4j日志采集

上面就是两条常见的log4j格式的日志内容,可以看到包含了常见的日志信息,对于这种日志信息,日志服务提供了logtail采集的方式可以将日志文件中的日志信息导入到SLS的logstore之中,采集上来的日志内容如下图

image

业务背景

对于常见的Java系统,为了能准确地定位和追踪,日志信息往往会通过log4j非常详细的输出出来。这些日志在日积月累后的数量是惊人的。例如每天产生1000万条数据,则一年为36亿条数据。一方面,长时间的数据存储需要巨大的存储空间,而通过减少存储周期的方式减少存储空间,虽然降低了存储成本,但也丢失了有价值的数据。另一方面,大量的无用数据将造成在分析有价值数据上的性能压力。

下面列举了三种常见的数据处理方案

方案

特点

方案一

image

完全自建,开发难度大,维护成本高

方案二

image

自己处理数据,自己保证exactly-once语义

方案三

image

  • 全托管(完善的调度机制,自动处理各种异常,失败告警)
  • 高效(单次最大处理百亿级数据)
  • 多样化(搭配SQL的强大分析能力以及灵活的时间窗口,可以满足绝大多数业务场景)

下面就采用方案三来完成对 log4j ERROR级别日志的定时分析及结果存储,并搭配可视化报表。

实践

准备LogStore

准备好使用源logstore,并且配置好索引(参考配置索引),使用logtail采集将log4j日志导入源logstore

源索引配置

image

源日志

image

目标logstore索引配置

image

业务要求

将ERROR级别的日志中的ErrorMessage和ErrorCode拿出来,投递到目标logstore,制作异常可视化仪表盘

查询配置

SQL代码如下

* and level: ERROR | SELECT trim(regexp_extract(message,'ErrorMessage:([^E]+).*', 1)) as ErrorMessage , trim(regexp_extract(message, 'ErrorCode:(.*)', 1)) as ErrorCode limit 100000

点击 查询分析,出现预览结果之后确认无误后点击 创建Scheduled SQL 按钮,创建Scheduled SQL作业

image

计算配置


资源池有增强型(收费,但资源可扩展,适用于大量计算且有 SLA 要求的业务场景)、免费(Project 级别 15 并行度,后续开放)两种,按照你的需求来设置即可。预览时没有数据可以选择旁边的时间选择按钮,扩大查询时间。写入模式有三种,可以参考 日志库时序存储创建Scheduled SQL作业,这里我们选择日志库导入日志库。

image

预览到数据之后,接下来需要我们配置目标logstore,如下图。选好目标project和logstore之后,需要我们配置读写目标的授权 角色ARN,1 2处的角色ARN参考 从Logstore到Logstore 中的 写目标授权,这里我已经提前配置好了默认角色,所以系统会自动填充好角色ARN。配置好后点击下一步,进行调度配置的设置。

image

调度配置


设置 SQL 每 5 分钟执行一次,每次执行处理最近 5 分钟窗口的数据。


注意:

1. 设置延迟执行参数,源 Logstore 的数据到来可能延迟,建议设置大一些的值做等待来保证计算数据的完整性。

2. SQL 运行超过指定次数或指定时间后,这一次的 SQL 实例会失败并继续下一个实例的调度。

image

作业查看、管理

依次点击1、2、3进入作业详情页面,可以在这个页面查看作业的详情,修改作业配置或者删除作业。

执行实例中展示了所选时间段的作业实例的基本信息,每个实例信息中有 SQL 查询区间,如果任务失败(权限、SQL 语法等原因)或 SQL 处理行数指标为 0(数据迟到或确实没有数据),可以对指定实例做重试运行(失败告警功能开发中)。

image

效果

可以看到,通过Scheduled SQL已经源logstore内部的ERROR日志筛选了出来,并分离出了ErrorCode和ErrorMessage

image

延伸

为了进行错误分析,还可以在目标logstore的查询的基础上制作可视化图表告警

制作错误信息统计图表,简单清晰反映系统的运行状况

  • 全局错误趋势统计

SQL

*|SELECT ErrorCode,COUNT(ErrorCode) AS count GROUP BY ErrorCode

写好SQL之后,点击 查询分析 查询处结果之后,点击下图位置处的饼图,出现饼图统计,然后点击添加到仪表盘

image

配置仪表盘信息后点击确定

image

然后依次点击下图1 2 3的位置进入新建的仪表盘

image

新建仪表盘信息如下图,点击箭头指示的位置可以修改查询时间范围,自动执行刚才的SQL,并将结果展示为饼图,点击右上角的编辑可以调整图表的大小和位置。

image

  • 各类型错误趋势统计

SQL:

*|select from_unixtime(__time__ - __time__ % 300) as dt, errorCode, count(1) as cnt group by dt, errorCode order by dt asc limit 100000

image

image

image

  • 更多信息请参考

采集Logj日志

Scheduled SQL工作原理

SQL分析语法与功能

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
21天前
|
Java
日志框架log4j打印异常堆栈信息携带traceId,方便接口异常排查
日常项目运行日志,异常栈打印是不带traceId,导致排查问题查找异常栈很麻烦。
|
1月前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
56 0
|
2月前
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
67 0
|
2月前
|
C# Windows 监控
WPF应用跨界成长秘籍:深度揭秘如何与Windows服务完美交互,扩展功能无界限!
【8月更文挑战第31天】WPF(Windows Presentation Foundation)是 .NET 框架下的图形界面技术,具有丰富的界面设计和灵活的客户端功能。在某些场景下,WPF 应用需与 Windows 服务交互以实现后台任务处理、系统监控等功能。本文探讨了两者交互的方法,并通过示例代码展示了如何扩展 WPF 应用的功能。首先介绍了 Windows 服务的基础知识,然后阐述了创建 Windows 服务、设计通信接口及 WPF 客户端调用服务的具体步骤。通过合理的交互设计,WPF 应用可获得更强的后台处理能力和系统级操作权限,提升应用的整体性能。
64 0
|
2月前
|
数据库 Java 监控
Struts 2 日志管理化身神秘魔法师,洞察应用运行乾坤,演绎奇幻篇章!
【8月更文挑战第31天】在软件开发中,了解应用运行状况至关重要。日志管理作为 Struts 2 应用的关键组件,记录着每个动作和决策,如同监控摄像头,帮助我们迅速定位问题、分析性能和使用情况,为优化提供依据。Struts 2 支持多种日志框架(如 Log4j、Logback),便于配置日志级别、格式和输出位置。通过在 Action 类中添加日志记录,我们能在开发过程中获取详细信息,及时发现并解决问题。合理配置日志不仅有助于调试,还能分析用户行为,提升应用性能和稳定性。
38 0
|
2月前
|
SQL 数据采集 数据挖掘
为什么要使用 SQL 函数?详尽分析
【8月更文挑战第31天】
22 0
|
2月前
|
SQL 安全 测试技术
【数据守护者必备】SQL数据备份与恢复策略全解析:从全量到日志备份,手把手教你确保企业信息万无一失的实战技巧!
【8月更文挑战第31天】数据库是企业核心业务数据的基石,为防止硬件故障、软件错误或人为失误导致的数据丢失,制定可靠的备份与恢复策略至关重要。本文通过一个在线购物平台的案例,详细介绍了使用 SQL Server 进行全量备份、差异备份及事务日志备份的方法,并演示了如何利用 SQL Server Agent 实现自动化备份任务。此外,还提供了数据恢复的具体步骤和测试建议,确保数据安全与业务连续性。
47 0
|
2月前
|
SQL 数据挖掘 BI
【超实用技巧】解锁SQL聚合函数的奥秘:从基础COUNT到高级多表分析,带你轻松玩转数据统计与挖掘的全过程!
【8月更文挑战第31天】SQL聚合函数是进行数据统计分析的强大工具,可轻松计算平均值、求和及查找极值等。本文通过具体示例,展示如何利用这些函数对`sales`表进行统计分析,包括使用`COUNT()`、`SUM()`、`AVG()`、`MIN()`、`MAX()`等函数,并结合`GROUP BY`和`HAVING`子句实现更复杂的数据挖掘需求。通过这些实践,你将学会如何高效地应用SQL聚合函数解决实际问题。
42 0
|
6天前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
3月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
67 13

热门文章

最新文章

相关产品

  • 日志服务
  • 下一篇
    无影云桌面