分析Log4j日志
本文以電商平臺(tái)的日志為例,介紹Log4j日志的分析操作。
前提條件
已采集Log4j日志。具體操作,請(qǐng)參見(jiàn)采集Log4j日志。
已配置索引。具體操作,請(qǐng)參見(jiàn)創(chuàng)建索引。
本案例的索引如下圖所示。
背景信息
Log4j是Apache的一個(gè)開(kāi)放源代碼項(xiàng)目,通過(guò)使用Log4j,您可以配置日志傳輸?shù)哪康牡兀缈刂婆_(tái)、文件、GUI組件、Socket服務(wù)器、NT的事件記錄器、UNIX Syslog守護(hù)進(jìn)程等;您也可以控制每一條日志的輸出格式;通過(guò)定義每一條日志信息的級(jí)別,您能夠更加細(xì)致地控制日志的生成過(guò)程。這些可以通過(guò)一個(gè)配置文件來(lái)靈活地進(jìn)行配置,而不需要修改應(yīng)用的代碼。Log4j由三個(gè)重要的組件構(gòu)成,如下所示:
日志格式化器(Layouts)
Layouts控制日志信息的格式化方式。常用Layouts有:
Layouts
含義
HTMLLayout
表示日志輸出格式化為HTML表格形式。
SimpleLayout
表示使用簡(jiǎn)單的輸出格式化,格式如默認(rèn)的INFO級(jí)別的消息。
PatternLayout
根據(jù)自定義格式輸出日志,您可以設(shè)置包括時(shí)間戳、日志級(jí)別、線程名、類名、方法名、日志消息等元素的排列和格式。
日志輸出端(Appenders)
Appenders定義了日志信息的輸出目的地。您可以配置多個(gè)Appender,將日志發(fā)送到不同的地方。常用Appenders有:
Appenders
含義
ConsoleAppender
將日志輸出到控制臺(tái)。
FileAppender
將日志輸出到文件中。
DailyRollingFileAppender
將日志輸出到一個(gè)文件,并且每天輸出到新的文件。
RollingFileAppender
將日志信息輸出到一個(gè)文件,并且指定文件的尺寸,當(dāng)文件大小達(dá)到指定尺寸時(shí),會(huì)自動(dòng)把文件改名,同時(shí)產(chǎn)生一個(gè)新的文件。
JDBCAppender
將日志信息保存到數(shù)據(jù)庫(kù)中。
日志記錄器(Loggers)
Loggers定義了日志記錄的入口點(diǎn),負(fù)責(zé)捕獲日志信息。每個(gè)Logger都會(huì)基于其重要性或嚴(yán)重程度分配到一個(gè)日志級(jí)別。Log4j定義了8個(gè)級(jí)別的log,優(yōu)先級(jí)從高到低依次為:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。日志記錄的級(jí)別具有繼承性,子類會(huì)記錄父類的所有日志級(jí)別。每種日志級(jí)別的含義如下:
日志級(jí)別
含義
OFF
關(guān)閉所有日志記錄。
FATAL
指出嚴(yán)重的錯(cuò)誤事件,將會(huì)導(dǎo)致應(yīng)用程序的退出。
ERROR
指出雖然發(fā)生錯(cuò)誤事件,但仍然不影響系統(tǒng)的繼續(xù)運(yùn)行。
WARN
表明會(huì)出現(xiàn)潛在的錯(cuò)誤情形。
INFO
一般用在粗粒度級(jí)別上,強(qiáng)調(diào)應(yīng)用程序的運(yùn)行過(guò)程。
DEBUG
一般用于調(diào)試應(yīng)用程序時(shí),對(duì)診斷問(wèn)題提供幫助。
TRACE
用于對(duì)程序追蹤,輸出程序運(yùn)行中的變量,顯示執(zhí)行的流程。
ALL
打印所有的日志記錄。
一個(gè)Logger可以對(duì)應(yīng)多個(gè)Appender,一個(gè)Appender只能對(duì)應(yīng)一個(gè)Layout。
例如某電商公司,希望通過(guò)分析用戶行為習(xí)慣數(shù)據(jù)(例如用戶登錄方式、上線的時(shí)間點(diǎn)及時(shí)長(zhǎng)、瀏覽頁(yè)面、頁(yè)面停留時(shí)間、平均下單時(shí)間、消費(fèi)水平等)、平臺(tái)穩(wěn)定性、系統(tǒng)報(bào)錯(cuò)、數(shù)據(jù)安全性等信息獲取平臺(tái)的最佳運(yùn)營(yíng)方案。針對(duì)此需求,日志服務(wù)提供一站式數(shù)據(jù)采集與分析功能,幫助客戶存儲(chǔ)并分析日志。
日志服務(wù)采集到的日志樣例如下所示。
記錄用戶登錄行為的日志
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
記錄用戶購(gòu)買行為的日志
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列表區(qū)域,單擊目標(biāo)Project。
在控制臺(tái)左側(cè),單擊日志存儲(chǔ),在日志庫(kù)列表中單擊目標(biāo)Logstore。
輸入查詢和分析語(yǔ)句,然后單擊最近15分鐘,設(shè)置查詢和分析的時(shí)間范圍。
更多信息,請(qǐng)參見(jiàn)步驟一:輸入查詢和分析語(yǔ)句。
統(tǒng)計(jì)最近1小時(shí)發(fā)生錯(cuò)誤最多的3個(gè)位置。
level: ERROR | select location ,count(*) as count GROUP BY location ORDER BY count DESC LIMIT 3
統(tǒng)計(jì)最近15分鐘各種日志級(jí)別的日志條數(shù)。
* | select level ,count(*) as count GROUP BY level ORDER BY count DESC
統(tǒng)計(jì)最近1小時(shí)登錄次數(shù)最多的三個(gè)用戶。
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
統(tǒng)計(jì)最近15分鐘每個(gè)用戶的付款總額。
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