Java應(yīng)用業(yè)務(wù)日志關(guān)聯(lián)調(diào)用鏈TraceId
您可以在Java應(yīng)用的業(yè)務(wù)日志中關(guān)聯(lián)調(diào)用鏈的TraceId信息,從而在應(yīng)用出現(xiàn)問題時(shí),能夠通過調(diào)用鏈的TraceId快速關(guān)聯(lián)到業(yè)務(wù)日志,及時(shí)定位、分析并解決問題。
前提條件
應(yīng)用監(jiān)控基礎(chǔ)版不支持該功能。
您已將Agent版本升級(jí)至2.6.1.2及以上版本,具體操作,請(qǐng)參見更新Java探針版本。
已通過日志服務(wù)SLS完成日志采集,具體操作,請(qǐng)參見數(shù)據(jù)采集概述。
背景信息
ARMS在業(yè)務(wù)日志中關(guān)聯(lián)調(diào)用鏈TraceId的功能基于MDC(Mapped Diagnostic Context)機(jī)制實(shí)現(xiàn),支持主流的Log4j、Log4j2和Logback日志框架。
開啟關(guān)聯(lián)業(yè)務(wù)日志與TraceId開關(guān)
登錄ARMS控制臺(tái),在左側(cè)導(dǎo)航欄選擇 。
在應(yīng)用列表頁面頂部選擇目標(biāo)地域,然后單擊目標(biāo)應(yīng)用名稱。
說明語言列的圖標(biāo)含義如下:
:接入應(yīng)用監(jiān)控的Java應(yīng)用。
:接入應(yīng)用監(jiān)控的Golang應(yīng)用。
:接入應(yīng)用監(jiān)控的Python應(yīng)用。
-:接入可觀測(cè)鏈路 OpenTelemetry 版的應(yīng)用。
在上方導(dǎo)航欄選擇
。在自定義配置頁簽的應(yīng)用日志關(guān)聯(lián)配置區(qū)域,選擇日志源為日志服務(wù)SLS,打開關(guān)聯(lián)業(yè)務(wù)日志與TraceId開關(guān),選擇日志服務(wù)所在地域,然后綁定Project和Logstore。
您還可以根據(jù)需求打開日志自動(dòng)填充traceId和日志自動(dòng)填充spanId開關(guān)。
說明開啟此開關(guān)后,業(yè)務(wù)日志中將會(huì)自動(dòng)生成調(diào)用鏈的TraceId,此時(shí)無需執(zhí)行步驟5手動(dòng)關(guān)聯(lián)Span ID。
如果您還需要實(shí)現(xiàn)精準(zhǔn)定位業(yè)務(wù)異常問題,請(qǐng)參見通過調(diào)用鏈路和日志分析定位業(yè)務(wù)異常問題。
(可選)在您業(yè)務(wù)日志的Layout的Pattern屬性中添加
%X{EagleEye-TraceID}
配置。您還可以通過添加
%X{span_id}
配置關(guān)聯(lián)Span ID。重要關(guān)聯(lián)Span ID功能僅支持4.x及以上探針版本。
如何在業(yè)務(wù)代碼中獲取
{EagleEye-TraceID}
,請(qǐng)參見ARMS Java SDK使用說明。
下面分別展示Log4j、Log4j2和Logback組件的示例配置文件:
Log4j配置文件log4j.properties的修改示例:
log4j.appender.warn.layout=org.apache.log4j.PatternLayout log4j.appender.warn.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}-[%p]-(%C:%L) - traceId:%X{EagleEye-TraceID} - spanId:%X{span_id} - %m%n
Log4j2配置文件log4j2.xml的修改示例:
PatternLayout
<console name="Console" target="SYSTEM_OUT"> <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - traceId:%X{EagleEye-TraceID} - spanId:%X{span_id} - %m%n"/> </console>
JsonLayout
<JsonLayout complete="false" compact="true" eventEol="true" properties="false" locationInfo="true" includeStacktrace="true" stacktraceAsString="true" objectMessageAsJsonObject="true" > <KeyValuePair key="EagleEye-TraceID" value="${ctx:EagleEye-TraceID}" /> <KeyValuePair key="span_id" value="${ctx:span_id}" /> </JsonLayout>
Logback配置文件logback.xml的修改示例:
PatternLayout
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - traceId:%X{EagleEye-TraceID} - spanId:%X{span_id} - %msg%n</pattern> </encoder>
JsonLayout
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"> <providers> <timestamp/> <threadName/> <logLevel/> <loggerName/> <message/> <callerData/> <stackTrace/> <pattern> <pattern> { "EagleEye-TraceID": "%X{EagleEye-TraceID}", "span_id": "%X{span_id}" } </pattern> </pattern> </providers> </encoder>
重啟應(yīng)用。
在應(yīng)用的業(yè)務(wù)日志中成功打印出TraceId信息,則說明業(yè)務(wù)日志關(guān)聯(lián)調(diào)用鏈的TraceId關(guān)聯(lián)成功,如下圖所示。
(可選)配置SLS日志采集接入,將應(yīng)用日志上傳至上述步驟綁定的Project和Logstore中。
ARMS默認(rèn)不會(huì)采集應(yīng)用日志。