ddtrace ログ関連付け¶
Warning
本ケースは ddtrace バージョン0.114.0(最新)を使用してテストしています
前提条件¶
- DataKit ddtrace コレクターを有効にします
- Shell を準備します
java -javaagent:D:/ddtrace/dd-java-agent-0.114.0.jar \
-Ddd.service.name=ddtrace-server \
-Ddd.agent.port=9529 \
-jar springboot-ddtrace-server.jar
注意:
- trace と log の関連付けは、どちらも MDC 方式で埋め込みを行います。
- ここでは jar パッケージの依存は不要で、ddtrace-agent が MDC に埋め込みを行います。
インストールとデプロイ¶
logback-spring.xml を例に説明します
1 logback-spring.xml¶
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
<!-- 一部のパラメータは properties ファイルから取得する必要があります -->
<springProperty scope="context" name="logName" source="spring.application.name" defaultValue="localhost.log"/>
<!-- 設定後、動的にログレベルを変更できます -->
<jmxConfigurator />
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] %X{dd.service} %X{dd.trace_id} %X{dd.span_id} - %msg%n" />
<!-- %m は出力情報、%p はログレベル、%t はスレッド名、%d は日付、%c はクラスの完全修飾名 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/${logName}/${logName}.log</file> <!-- 使用方法 -->
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>logs/${logName}/${logName}-%d{yyyy-MM-dd}.log.%i</fileNamePattern>
<maxFileSize>64MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- error レベルのみ出力 -->
<logger name="com.netflix" level="ERROR" />
<logger name="net.sf.json" level="ERROR" />
<logger name="org.springframework" level="ERROR" />
<logger name="springfox" level="ERROR" />
<!-- SQL 出力設定 -->
<logger name="com.github.pagehelper.mapper" level="DEBUG" />
<logger name="org.apache.ibatis" level="DEBUG" />
<root level="info">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>
主に pattern でログフォーマットを設定します
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] %X{dd.service} %X{dd.trace_id} %X{dd.span_id} - %msg%n
2022-06-10 17:07:45.257 [main] INFO o.a.c.c.StandardEngine - [log,173] ddtrace-server - Starting Servlet engine: [Apache Tomcat/9.0.56]
2022-06-10 17:07:45.369 [main] INFO o.a.c.c.C.[.[.[/] - [log,173] ddtrace-server - Initializing Spring embedded WebApplicationContext
2022-06-10 17:07:45.758 [main] INFO o.a.c.h.Http11NioProtocol - [log,173] ddtrace-server - Starting ProtocolHandler ["http-nio-8080"]
2022-06-10 17:07:45.786 [main] INFO c.z.o.d.DdtraceApplication - [logStarted,61] ddtrace-server - Started DdtraceApplication in 2.268 seconds (JVM running for 5.472)
2022-06-10 17:09:01.493 [http-nio-8080-exec-1] INFO o.a.c.c.C.[.[.[/] - [log,173] ddtrace-server 5983174698688502665 5075189911231446778 - Initializing Spring DispatcherServlet 'dispatcherServlet'
2022-06-10 17:09:01.550 [http-nio-8080-exec-1] INFO c.z.o.d.c.IndexController - [gateway,48] ddtrace-server 5983174698688502665 7355870844984555943 - this is tag
2022-06-10 17:09:01.625 [http-nio-8080-exec-3] INFO c.z.o.d.c.IndexController - [auth,69] ddtrace-server 5983174698688502665 7209299453959523135 - this is auth
2022-06-10 17:09:01.631 [http-nio-8080-exec-4] INFO c.z.o.d.c.IndexController - [billing,77] ddtrace-server 5983174698688502665 9179949003735674110 - this is method3,null
2 DataKit によるログ収集¶
上記のログがテキストに出力された後、DataKit はテキストファイルからログ情報を読み取って Guance に報告できます。
2.1 ログコレクターを有効にする¶
# {"version": "1.2.18", "desc": "do NOT edit this line"}
[[inputs.logging]]
## 必須
logfiles = [
"D:/code_zy/observable-demo/logs/ddtrace-server/*.log",
]
# サポートされるプロトコルは TCP と UDP のみ
# sockets = [
# "tcp://0.0.0.0:9530",
# "udp://0.0.0.0:9531",
# ]
## glob フィルター
ignore = [""]
## ログソース。空の場合は 'default' を使用
source = "ddtrace-server"
## サービス名。空の場合は $source を使用
service = "ddtrace-server"
## grok パイプラインスクリプト名
pipeline = "log-ddtrace.p"
## オプションのステータス:
## "emerg","alert","critical","error","warning","info","debug","OK"
ignore_status = []
## オプションのエンコーディング:
## "utf-8", "utf-16le", "utf-16le", "gbk", "gb18030" or ""
character_encoding = ""
## DataKit はファイルまたはソケットからテキストを読み取ります。デフォルトの最大テキスト行長は 32K です。
## ログ行が 32KB を超える場合は、テキスト長を設定してください。ただし最大長は 32MB を超えられません。
# maximum_length = 32766
## パターンは正規表現である必要があります。'''この正規表現''' の使用に注意してください。
## 正規表現リンク: https://golang.org/pkg/regexp/syntax/#hdr-Syntax
# multiline_match = '''^\S'''
## テキスト文字列から ANSI エスケープコードを削除します
remove_ansi_escape_codes = false
## ファイルが非アクティブな場合、無視されます
## 時間単位は "ms", "s", "m", "h"
ignore_dead_log = "10m"
[inputs.logging.tags]
# some_tag = "some_value"
# more_tag = "some_other_value"
2.2 Pipeline を設定する¶
ログをパースし、フィルタリング・絞り込み・データ分析に使用するためのキーフィールドをタグとして抽出することを目的としています。
# ログ形式
#2022-06-10 17:09:01.625 [http-nio-8080-exec-3] INFO c.z.o.d.c.IndexController - [auth,69] ddtrace-server 5983174698688502665 7209299453959523135 - this is auth
grok(_, "%{TIMESTAMP_ISO8601:time} %{NOTSPACE:thread_name} %{LOGLEVEL:status}%{SPACE}%{NOTSPACE:class_name} - \\[%{NOTSPACE:method_name},%{NUMBER:line}\\] %{DATA:service_name} %{DATA:trace_id} %{DATA:span_id} - %{GREEDYDATA:msg}")
default_time(time,"Asia/Shanghai")
パース後のログには、多くのタグが生成されています
Guance は他のログ収集方式(socket など)もサポートしています。詳細なログ収集については、ログ を参照してください。
3 効果の表示¶
ログから traceId と spanId を抽出すると、Guance 上でログから対応するトレース情報に直接関連付けることができ、ログとトレースの連携が実現します。
参考ドキュメント¶
<デモソースコード>

