簡介
日志可能是一種最簡單的不能再簡單的存儲抽象,隻能追加、按照時間完全有序(totally-ordered)的記錄序列。作為項目開發必不可少的一部分,日志不僅可以幫助開發人員調試和優化系統,還可以是一種有價值的資訊寶庫,但是各系統混雜的日志如果不加以篩選和規範,就很難發揮其中的價值。
阿裡雲
日志服務(SLS)是雲原生觀測分析平台,為Log/Metric/Trace等資料提供大規模、低成本、實時平台化服務。一站式提供資料采集、加工、分析、告警可視化與投遞功能,全面提升研發、運維、營運和安全等場景數字化能力。
Scheduled SQL是一項由 SLS 全托管的用于定時分析資料、存儲聚合資料、投影與過濾資料的功能,簡單來說就是:定時排程 +
查詢分析。解決場景需求包括:
- 定時分析資料:根據業務需求設定 SQL 語句或查詢分析語句,定時執行資料分析,并将分析結果存儲到目标庫中。
- 全局聚合:對全量、細粒度的資料進行聚合存儲,彙總為存儲大小、精度适合的資料,相當于一定程度的有損壓縮資料。

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之中,采集上來的日志内容如下圖
業務背景
對于常見的Java系統,為了能準确地定位和追蹤,日志資訊往往會通過log4j非常詳細的輸出出來。這些日志在日積月累後的數量是驚人的。例如每天産生1000萬條資料,則一年為36億條資料。一方面,長時間的資料存儲需要巨大的存儲空間,而通過減少存儲周期的方式減少存儲空間,雖然降低了存儲成本,但也丢失了有價值的資料。另一方面,大量的無用資料将造成在分析有價值資料上的性能壓力。
下面列舉了三種常見的資料處理方案
方案 | 特點 | |
方案一 | | 完全自建,開發難度大,維護成本高 |
方案二 | | 自己處理資料,自己保證exactly-once語義 |
方案三 | |
|
下面就采用方案三來完成對 log4j ERROR級别日志的定時分析及結果存儲,并搭配可視化報表。
實踐
準備LogStore
準備好使用源logstore,并且配置好索引(參考
配置索引),使用
将log4j日志導入源logstore
源索引配置
源日志
目标logstore索引配置
業務要求
将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作業
計算配置
資源池有增強型(收費,但資源可擴充,适用于大量計算且有 SLA 要求的業務場景)、免費(Project 級别 15 并行度,後續開放)兩種,按照你的需求來設定即可。預覽時沒有資料可以選擇旁邊的時間選擇按鈕,擴大查詢時間。寫入模式有三種,可以參考
日志庫、
時序存儲和
建立Scheduled SQL作業,這裡我們選擇日志庫導入日志庫。
預覽到資料之後,接下來需要我們配置目标logstore,如下圖。選好目标project和logstore之後,需要我們配置讀寫目标的授權 角色ARN,1 2處的角色ARN參考
從Logstore到Logstore中的 寫目标授權,這裡我已經提前配置好了預設角色,是以系統會自動填充好角色ARN。配置好後點選下一步,進行排程配置的設定。
排程配置
設定 SQL 每 5 分鐘執行一次,每次執行處理最近 5 分鐘視窗的資料。
注意:
1. 設定延遲執行參數,源 Logstore 的資料到來可能延遲,建議設定大一些的值做等待來保證計算資料的完整性。
2. SQL 運作超過指定次數或指定時間後,這一次的 SQL 執行個體會失敗并繼續下一個執行個體的排程。
作業檢視、管理
依次點選1、2、3進入作業詳情頁面,可以在這個頁面檢視作業的詳情,修改作業配置或者删除作業。
執行執行個體中展示了所選時間段的作業執行個體的基本資訊,每個執行個體資訊中有 SQL 查詢區間,如果任務失敗(權限、SQL 文法等原因)或 SQL 處理行數名額為 0(資料遲到或确實沒有資料),可以對指定執行個體做重試運作(失敗告警功能開發中)。
效果
可以看到,通過Scheduled SQL已經源logstore内部的ERROR日志篩選了出來,并分離出了ErrorCode和ErrorMessage
延伸
為了進行錯誤分析,還可以在目标logstore的查詢的基礎上制作
可視化圖表 告警制作錯誤資訊統計圖表,簡單清晰反映系統的運作狀況
- 全局錯誤趨勢統計
SQL
*|SELECT ErrorCode,COUNT(ErrorCode) AS count GROUP BY ErrorCode
寫好SQL之後,點選 查詢分析 查詢處結果之後,點選下圖位置處的餅圖,出現餅圖統計,然後點選添加到儀表盤
配置儀表盤資訊後點選确定
然後依次點選下圖1 2 3的位置進入建立的儀表盤
建立儀表盤資訊如下圖,點選箭頭訓示的位置可以修改查詢時間範圍,自動執行剛才的SQL,并将結果展示為餅圖,點選右上角的編輯可以調整圖表的大小和位置。
- 各類型錯誤趨勢統計
SQL:
*|select from_unixtime(__time__ - __time__ % 300) as dt, errorCode, count(1) as cnt group by dt, errorCode order by dt asc limit 100000
- 更多資訊請參考