本文以電商平台的日誌為例,介紹Log4j日誌的分析操作。
前提條件
背景資訊
Log4j是Apache的一個開放原始碼專案,通過使用Log4j,您可以配置日誌傳輸的目的地,例如控制台、檔案、GUI組件、Socket伺服器、NT的事件記錄器、UNIX Syslog守護進程等;您也可以控制每一條日誌的輸出格式;通過定義每一條日誌資訊的層級,您能夠更加細緻地控制日誌的產生過程。這些可以通過一個設定檔來靈活地進行配置,而不需要修改應用的代碼。Log4j由三個重要的組件構成,如下所示:
日誌格式化器(Layouts)
Layouts控制日誌資訊的格式化方式。常用Layouts有:
Layouts
含義
HTMLLayout
表示日誌輸出格式化為HTML表格形式。
SimpleLayout
表示使用簡單的輸出格式化,格式如預設的INFO層級的訊息。
PatternLayout
根據自訂格式輸出日誌,您可以設定包括時間戳記、記錄層級、線程名、類名、方法名、日誌訊息等元素的排列和格式。
日誌輸出端(Appenders)
Appenders定義了日誌資訊的輸出目的地。您可以配置多個Appender,將日誌發送到不同的地方。常用Appenders有:
Appenders
含義
ConsoleAppender
將日誌輸出到控制台。
FileAppender
將日誌輸出到檔案中。
DailyRollingFileAppender
將日誌輸出到一個檔案,並且每天輸出到新的檔案。
RollingFileAppender
將日誌資訊輸出到一個檔案,並且指定檔案的尺寸,當檔案大小達到指定尺寸時,會自動把檔案改名,同時產生一個新的檔案。
JDBCAppender
將日誌資訊儲存到資料庫中。
日誌記錄器(Loggers)
Loggers定義了日誌記錄的進入點,負責捕獲日誌資訊。每個Logger都會基於其重要性或嚴重程度分配到一個記錄層級。Log4j定義了8個層級的log,優先順序從高到低依次為:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。日誌記錄的層級具有繼承性,子類會記錄父類的所有記錄層級。每種記錄層級的含義如下:
記錄層級
含義
OFF
關閉所有日誌記錄。
FATAL
指出嚴重的錯誤事件,將會導致應用程式的退出。
ERROR
指出雖然發生錯誤事件,但仍然不影響系統的繼續運行。
WARN
表明會出現潛在的錯誤情形。
INFO
一般用在粗粒度層級上,強調應用程式的運行過程。
DEBUG
一般用於調試應用程式時,對診斷問題提供協助。
TRACE
用於對程式追蹤,輸出程式運行中的變數,顯示執行的流程。
ALL
列印所有的日誌記錄。
一個Logger可以對應多個Appender,一個Appender只能對應一個Layout。
例如某電商公司,希望通過分析使用者行為習慣資料(例如使用者登入方式、上線的時間點及時間長度、瀏覽頁面、頁面停留時間、平均下單時間、消費水平等)、平台穩定性、系統報錯、資料安全性等資訊擷取平台的最佳營運方案。針對此需求,Log Service提供一站式資料擷取與分析功能,協助客戶儲存並分析日誌。
Log Service採集到的日誌範例如下所示。
記錄使用者登入行為的日誌
level: INFO location: com.aliyun.log4jappendertest.Log4jAppenderBizDemo.login(Log4jAppenderBizDemo.java:38) message: User login successfully. requestID=id4 userID=user8 thread: main time: 2022-01-26T15:31+0000
記錄使用者購買行為的日誌
level: INFO location: com.aliyun.log4jappendertest.Log4jAppenderBizDemo.order(Log4jAppenderBizDemo.java:46) message: Place an order successfully. requestID=id44 userID=user8 itemID=item3 amount=9 thread: main time: 2022-01-26T15:31+0000
操作步驟
在Project列表地區,單擊目標Project。
在控制台左側,單擊日誌儲存,在日誌庫列表中單擊目標Logstore。
輸入查詢和分析語句,然後單擊最近15分鐘,設定查詢和分析的時間範圍。
更多資訊,請參見步驟一:輸入查詢和分析語句。
統計最近1小時發生錯誤最多的3個位置。
level: ERROR | select location ,count(*) as count GROUP BY location ORDER BY count DESC LIMIT 3
統計最近15分鐘各種記錄層級的日誌條數。
* | select level ,count(*) as count GROUP BY level ORDER BY count DESC
統計最近1小時登入次數最多的三個使用者。
login | SELECT regexp_extract(message, 'userID=(?<userID>[a-zA-Z\d]+)', 1) AS userID, count(*) as count GROUP BY userID ORDER BY count DESC LIMIT 3
統計最近15分鐘每個使用者的付款總額。
order | SELECT regexp_extract(message, 'userID=(?<userID>[a-zA-Z\d]+)', 1) AS userID, sum(cast(regexp_extract(message, 'amount=(?<amount>[a-zA-Z\d]+)', 1) AS double)) AS amount GROUP BY userID