天天看點

基于Scheduled SQL的log4j日志異常事件過濾與分析

簡介

日志可能是一種最簡單的不能再簡單的存儲抽象,隻能追加、按照時間完全有序(totally-ordered)的記錄序列。作為項目開發必不可少的一部分,日志不僅可以幫助開發人員調試和優化系統,還可以是一種有價值的資訊寶庫,但是各系統混雜的日志如果不加以篩選和規範,就很難發揮其中的價值。

阿裡雲

日志服務

(SLS)是雲原生觀測分析平台,為Log/Metric/Trace等資料提供大規模、低成本、實時平台化服務。一站式提供資料采集、加工、分析、告警可視化與投遞功能,全面提升研發、運維、營運和安全等場景數字化能力。

Scheduled SQL

是一項由 SLS 全托管的用于定時分析資料、存儲聚合資料、投影與過濾資料的功能,簡單來說就是:定時排程 +

查詢分析

。解決場景需求包括:

  • 定時分析資料:根據業務需求設定 SQL 語句或查詢分析語句,定時執行資料分析,并将分析結果存儲到目标庫中。
  • 全局聚合:對全量、細粒度的資料進行聚合存儲,彙總為存儲大小、精度适合的資料,相當于一定程度的有損壓縮資料。
基于Scheduled SQL的log4j日志異常事件過濾與分析

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之中,采集上來的日志内容如下圖

基于Scheduled SQL的log4j日志異常事件過濾與分析

業務背景

對于常見的Java系統,為了能準确地定位和追蹤,日志資訊往往會通過log4j非常詳細的輸出出來。這些日志在日積月累後的數量是驚人的。例如每天産生1000萬條資料,則一年為36億條資料。一方面,長時間的資料存儲需要巨大的存儲空間,而通過減少存儲周期的方式減少存儲空間,雖然降低了存儲成本,但也丢失了有價值的資料。另一方面,大量的無用資料将造成在分析有價值資料上的性能壓力。

下面列舉了三種常見的資料處理方案

方案 特點
方案一
基于Scheduled SQL的log4j日志異常事件過濾與分析
完全自建,開發難度大,維護成本高
方案二
基于Scheduled SQL的log4j日志異常事件過濾與分析
自己處理資料,自己保證exactly-once語義
方案三
基于Scheduled SQL的log4j日志異常事件過濾與分析
  • 全托管(完善的排程機制,自動處理各種異常,失敗告警)
  • 高效(單次最大處理百億級資料)
  • 多樣化(搭配SQL的強大分析能力以及靈活的時間視窗,可以滿足絕大多數業務場景)

下面就采用方案三來完成對 log4j ERROR級别日志的定時分析及結果存儲,并搭配可視化報表。

實踐

準備LogStore

準備好使用源logstore,并且配置好索引(參考

配置索引

),使用

将log4j日志導入源logstore

源索引配置

基于Scheduled SQL的log4j日志異常事件過濾與分析

源日志

基于Scheduled SQL的log4j日志異常事件過濾與分析

目标logstore索引配置

基于Scheduled SQL的log4j日志異常事件過濾與分析

業務要求

将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作業

基于Scheduled SQL的log4j日志異常事件過濾與分析

計算配置

資源池有增強型(收費,但資源可擴充,适用于大量計算且有 SLA 要求的業務場景)、免費(Project 級别 15 并行度,後續開放)兩種,按照你的需求來設定即可。預覽時沒有資料可以選擇旁邊的時間選擇按鈕,擴大查詢時間。寫入模式有三種,可以參考

日志庫

時序存儲

建立Scheduled SQL作業

,這裡我們選擇日志庫導入日志庫。

基于Scheduled SQL的log4j日志異常事件過濾與分析

預覽到資料之後,接下來需要我們配置目标logstore,如下圖。選好目标project和logstore之後,需要我們配置讀寫目标的授權 角色ARN,1 2處的角色ARN參考

從Logstore到Logstore

中的 寫目标授權,這裡我已經提前配置好了預設角色,是以系統會自動填充好角色ARN。配置好後點選下一步,進行排程配置的設定。

基于Scheduled SQL的log4j日志異常事件過濾與分析

排程配置

設定 SQL 每 5 分鐘執行一次,每次執行處理最近 5 分鐘視窗的資料。

注意:

1. 設定延遲執行參數,源 Logstore 的資料到來可能延遲,建議設定大一些的值做等待來保證計算資料的完整性。

2. SQL 運作超過指定次數或指定時間後,這一次的 SQL 執行個體會失敗并繼續下一個執行個體的排程。

基于Scheduled SQL的log4j日志異常事件過濾與分析

作業檢視、管理

依次點選1、2、3進入作業詳情頁面,可以在這個頁面檢視作業的詳情,修改作業配置或者删除作業。

執行執行個體中展示了所選時間段的作業執行個體的基本資訊,每個執行個體資訊中有 SQL 查詢區間,如果任務失敗(權限、SQL 文法等原因)或 SQL 處理行數名額為 0(資料遲到或确實沒有資料),可以對指定執行個體做重試運作(失敗告警功能開發中)。

基于Scheduled SQL的log4j日志異常事件過濾與分析

效果

可以看到,通過Scheduled SQL已經源logstore内部的ERROR日志篩選了出來,并分離出了ErrorCode和ErrorMessage

基于Scheduled SQL的log4j日志異常事件過濾與分析

延伸

為了進行錯誤分析,還可以在目标logstore的查詢的基礎上制作

可視化圖表 告警

制作錯誤資訊統計圖表,簡單清晰反映系統的運作狀況

  • 全局錯誤趨勢統計

SQL

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

寫好SQL之後,點選 查詢分析 查詢處結果之後,點選下圖位置處的餅圖,出現餅圖統計,然後點選添加到儀表盤

基于Scheduled SQL的log4j日志異常事件過濾與分析

配置儀表盤資訊後點選确定

基于Scheduled SQL的log4j日志異常事件過濾與分析

然後依次點選下圖1 2 3的位置進入建立的儀表盤

基于Scheduled SQL的log4j日志異常事件過濾與分析

建立儀表盤資訊如下圖,點選箭頭訓示的位置可以修改查詢時間範圍,自動執行剛才的SQL,并将結果展示為餅圖,點選右上角的編輯可以調整圖表的大小和位置。

基于Scheduled SQL的log4j日志異常事件過濾與分析
  • 各類型錯誤趨勢統計

SQL:

*|select from_unixtime(__time__ - __time__ % 300) as dt, errorCode, count(1) as cnt group by dt, errorCode order by dt asc limit 100000      
基于Scheduled SQL的log4j日志異常事件過濾與分析
基于Scheduled SQL的log4j日志異常事件過濾與分析
基于Scheduled SQL的log4j日志異常事件過濾與分析
  • 更多資訊請參考
采集Logj日志 Scheduled SQL工作原理 SQL分析文法與功能