解析Java報錯日志
在大數(shù)據(jù)、高并發(fā)場景下的Java應(yīng)用中,通過有效方式分析Java報錯日志并提供運(yùn)維指導(dǎo),能有效減輕產(chǎn)品運(yùn)營維護(hù)成本。日志服務(wù)支持采集各云產(chǎn)品的Java報錯日志,通過數(shù)據(jù)加工解析Java錯誤日志。
前提條件
已采集各SLS、OSS、SLB、RDS的Java錯誤日志到cloud_product_error_log的Logstore。具體操作,請參見Logtail采集日志。
場景描述
某企業(yè)基于阿里云OSS、SLS等產(chǎn)品開發(fā)Java應(yīng)用A過程中,在華東1(杭州)地域創(chuàng)建了名為cloud_product_erro_log的Logstore,用于存儲調(diào)用各云產(chǎn)品接口發(fā)生的Java報錯日志。該企業(yè)需要使用日志服務(wù)定期分析調(diào)用接口發(fā)生的Java報錯日志,便于制定Java報錯處理措施。
為實(shí)現(xiàn)以上需求,您需要解析日志中的時間、錯誤碼、狀態(tài)碼、產(chǎn)品信息、錯誤碼信息、請求方法和出錯行號,存儲到各產(chǎn)品的Logstore中,用于錯誤日志分析。
原始日志樣例如下:
__source__:192.0.2.10
__tag__:__client_ip__:203.0.113.10
__tag__:__receive_time__:1591957901
__topic__:
message: 2021-05-15 16:43:35 ParameterInvalid 400
com.aliyun.openservices.log.exception.LogException:The body is not valid json string.
at com.aliyun.openservice.log.Client.ErrorCheck(Client.java:2161)
at com.aliyun.openservice.log.Client.SendData(Client.java:2312)
at com.aliyun.openservice.log.Client.PullLogsk(Client.java:1397)
at com.aliyun.openservice.log.Client.SendData(Client.java:2265)
at com.aliyun.openservice.log.Client.GetCursor(Client.java:1123)
at com.aliyun.openservice.log.Client.PullLogs(Client.java:2161)
at com.aliyun.openservice.log.Client.ErrorCheck(Client.java:2426)
at transformEvent.main(transformEvent.java:2559)
總體流程
通過Logtail采集應(yīng)用A的報錯日志到名稱為cloud_product_error_log的Logstore中,然后再經(jīng)過數(shù)據(jù)加工后投遞到各自產(chǎn)品的Logstore中,最后對各個產(chǎn)品的錯誤日志做分析。總體流程如下:
設(shè)計數(shù)據(jù)加工語句:數(shù)據(jù)加工分析,編寫數(shù)據(jù)加工語句。
創(chuàng)建數(shù)據(jù)加工任務(wù):根據(jù)產(chǎn)品不同,將日志分發(fā)至不同產(chǎn)品的錯誤分析Logstore。
查詢和分析數(shù)據(jù):在各產(chǎn)品的錯誤分析Logstore中進(jìn)行日志分析。
步驟一:設(shè)計數(shù)據(jù)加工語句
加工流程
為便于錯誤日志分析,需要:
提取message字段中的時間、錯誤碼、狀態(tài)碼、產(chǎn)品信息、錯誤碼信息、請求方法和出錯行號。
將錯誤日志存儲到各產(chǎn)品的Logstore。
加工邏輯分析
分析原始日志字段中的時間、錯誤碼、狀態(tài)碼、產(chǎn)品信息、錯誤碼信息、請求方法和出錯行號,為提取每種字段設(shè)計正則表達(dá)式。
語法詳解
使用regex_match函數(shù)匹配出此條日志中是否有LogException。更多信息,請參見regex_match。
如果匹配上則按照解析SLS錯誤日志的規(guī)則進(jìn)行處理;如果匹配上OSSException則按照解析OSS錯誤日志的規(guī)則進(jìn)行處理。更多信息,請參見e_switch。
使用e_regex正則解析函數(shù)解析相應(yīng)的錯誤日志。更多信息,請參見e_regex。
刪除原字段message信息,并投遞到相應(yīng)產(chǎn)品的Logstore。更多信息,請參見e_drop_fields和e_output、e_coutput。
更多信息,請參見正則表達(dá)式-分組。
加工語法分析
以使用正則表達(dá)式解析SLS錯誤日志為例,具體如下:
具體的加工語法為:
e_switch(
regex_match(v("message"), r"LogException"),
e_compose(
e_regex(
"message",
"(?P<data_time>\S+\s\S+)\s(?P<error_code>[a-zA-Z]+)\s(?P<status>[0-9]+)\scom\.aliyun\.openservices\.log\.exception\.(?P<product_exception>[a-zA-Z]+)\:(?P<error_message>[a-zA-Z0-9:,\-\s]+)\.(\s+\S+\s\S+){5}\s+\S+\scom\.aliyun\.openservices\.log\.Client\.(?P<method>[a-zA-Z]+)\S+\s+\S+\stransformEvent\.main\(transformEvent\.java\:(?P<error_line>[0-9]+)\)",
),
e_drop_fields("message"),
e_output("sls-error"),
),
regex_match(v("message"), r"OSSException"),
e_compose(
e_regex(
"message",
"(?P<data_time>\S+\s\S+)\scom\.aliyun\.oss\.(?P<product_exception>[a-zA-Z]+)\:(?P<error_message>[a-zA-Z0-9,\s]+)\.\n\[ErrorCode\]\:\s(?P<error_code>[a-zA-Z]+)\n\[RequestId\]\:\s(?P<request_id>[a-zA-Z0-9]+)\n\[HostId\]\:\s(?P<host_id>[a-zA-Z-.]+)\n\S+\n\S+(\s\S+){3}\n\s+\S+\s+(.+)(\s+\S+){24}\scom\.aliyun\.oss\.OSSClient\.(?P<method>[a-zA-Z]+)\S+\s+\S+\stransformEvent\.main\(transformEvent\.java:(?P<error_line>[0-9]+)\)",
),
e_drop_fields("message"),
e_output("oss-error"),
),
)
步驟二:創(chuàng)建數(shù)據(jù)加工任務(wù)
進(jìn)入數(shù)據(jù)加工頁面。
在Project列表區(qū)域,單擊目標(biāo)Project。
在 頁簽中,單擊目標(biāo)Logstore。
在查詢和分析頁面,單擊數(shù)據(jù)加工。
在頁面右上角,選擇數(shù)據(jù)的時間范圍。
請確保在原始日志頁簽中有Log。
在編輯框中,輸入數(shù)據(jù)加工語句。
e_switch( regex_match(v("message"), r"LogException"), e_compose( e_regex( "message", "(?P<data_time>\S+\s\S+)\s(?P<error_code>[a-zA-Z]+)\s(?P<status>[0-9]+)\scom\.aliyun\.openservices\.log\.exception\.(?P<product_exception>[a-zA-Z]+)\:(?P<error_message>[a-zA-Z0-9:,\-\s]+)\.(\s+\S+\s\S+){5}\s+\S+\scom\.aliyun\.openservices\.log\.Client\.(?P<method>[a-zA-Z]+)\S+\s+\S+\stransformEvent\.main\(transformEvent\.java\:(?P<error_line>[0-9]+)\)", ), e_drop_fields("message"), e_output("sls-error"), ), regex_match(v("message"), r"OSSException"), e_compose( e_regex( "message", "(?P<data_time>\S+\s\S+)\scom\.aliyun\.oss\.(?P<product_exception>[a-zA-Z]+)\:(?P<error_message>[a-zA-Z0-9,\s]+)\.\n\[ErrorCode\]\:\s(?P<error_code>[a-zA-Z]+)\n\[RequestId\]\:\s(?P<request_id>[a-zA-Z0-9]+)\n\[HostId\]\:\s(?P<host_id>[a-zA-Z-.]+)\n\S+\n\S+(\s\S+){3}\n\s+\S+\s+(.+)(\s+\S+){24}\scom\.aliyun\.oss\.OSSClient\.(?P<method>[a-zA-Z]+)\S+\s+\S+\stransformEvent\.main\(transformEvent\.java:(?P<error_line>[0-9]+)\)", ), e_drop_fields("message"), e_output("oss-error"), ), )
單擊預(yù)覽數(shù)據(jù)。
創(chuàng)建數(shù)據(jù)加工任務(wù)。
單擊保存數(shù)據(jù)加工。
在創(chuàng)建數(shù)據(jù)加工任務(wù)面板,配置如下信息,然后單擊確定。
參數(shù)
說明
任務(wù)名稱
數(shù)據(jù)加工任務(wù)的名稱。例如test。
授權(quán)方式
選擇默認(rèn)角色讀取源Logstore數(shù)據(jù)。
存儲目標(biāo)
目標(biāo)名稱
存儲目標(biāo)的名稱。例如sls-error和oss-error。
目標(biāo)Region
選擇目標(biāo)Project所在地域。例如華東1(杭州)。
目標(biāo)Project
用于存儲數(shù)據(jù)加工結(jié)果的目標(biāo)Project名稱。
目標(biāo)庫
用于存儲數(shù)據(jù)加工結(jié)果的目標(biāo)Logstore名稱。例如sls-error和oss-error。
授權(quán)方式
選擇擇默認(rèn)角色將數(shù)據(jù)加工結(jié)果寫入目標(biāo)日志庫。
加工范圍
時間范圍
時間范圍選擇所有。
創(chuàng)建數(shù)據(jù)加工任務(wù)后,日志服務(wù)默認(rèn)為每個加工任務(wù)創(chuàng)建一個儀表盤,您可以在儀表盤中查看數(shù)據(jù)加工任務(wù)運(yùn)行指標(biāo)。
通過異常詳情圖表,可以查到具體哪一條日志沒有解析出來,然后再調(diào)整正則表達(dá)式。
如果解析Log失敗,上報WARNING級別日志。該類報錯不會影響到整個加工任務(wù)繼續(xù)執(zhí)行。
如果上報ERROR級別日志,則會影響到整個加工任務(wù)的繼續(xù)執(zhí)行。需要逐步查找定位問題,并修改正則表達(dá)式,直到加工任務(wù)能夠成功解析各個不同類型的錯誤日志。
步驟三:分析錯誤日志數(shù)據(jù)
基于加工后的錯誤日志,可以進(jìn)行錯誤日志數(shù)據(jù)分析。本文只對日志服務(wù)的Java錯誤日志做分析。
在Project列表區(qū)域,單擊目標(biāo)Project。
在 頁簽中,單擊目標(biāo)Logstore。
在搜索框中輸入查詢和分析語句。
統(tǒng)計每個調(diào)用方法出現(xiàn)錯誤的數(shù)量。
* | SELECT COUNT(method) as m_ct, method GROUP BY method
統(tǒng)計PutLogs中哪一類的錯誤信息占比最大。
* | SELECT error_message,COUNT(error_message) as ct_msg, method WHERE method LIKE 'PutLogs' GROUP BY error_message,method
統(tǒng)計各個錯誤碼出現(xiàn)的錯誤次數(shù)。
* | SELECT error_code,COUNT(error_code) as count_code GROUP BY error_code
設(shè)置報錯時間軸,實(shí)時查看調(diào)用接口錯誤信息。
* | SELECT date_format(data_time, '%Y-%m-%d %H:%m:%s') as date_time,status,product_exception,error_line, error_message,method ORDER BY date_time desc
單擊15分鐘(相對),設(shè)置查詢分析的時間范圍。
您可以設(shè)置相對時間、整點(diǎn)時間和自定義時間。
說明查詢結(jié)果有1 min以內(nèi)的誤差。
單擊查詢/分析,查看查詢分析結(jié)果。