如何通过OpenTelemetry Java Agent嵌入Appender添加调用方等日志字段?
实现OpenTelemetry Java Agent嵌入式Log4j Appender添加指定字段
方法1:通过系统属性快速启用字段捕获
OpenTelemetry Java Agent针对Log4j的 instrumentation提供了实验性配置,可直接开启部分字段的捕获:
- 捕获
threadName:添加系统属性-Dotel.instrumentation.log4j-appender.experimental.capture-thread-context=true - 捕获调用者信息(
callerClass和callerLine):开启调用栈捕获
开启后,默认会在日志的-Dotel.instrumentation.log4j-appender.experimental.capture-call-stack=truestack_trace节点下包含调用类和行号,但如果需要将这两个字段单独提取出来,就得用自定义JSON模板。
方法2:自定义JSON模板精准控制输出字段
OpenTelemetry的嵌入式Log4j Appender基于Log4j的JsonTemplateLayout,你可以通过自定义模板文件来定义想要的输出结构:
- 创建模板文件(例如
otel-log-template.json),内容如下:
{ "timestamp": { "$resolver": "timestamp", "pattern": "yyyy-MM-dd'T'HH:mm:ss.SSSXXX" }, "trace_id": { "$resolver": "mdc", "key": "trace_id" }, "span_id": { "$resolver": "mdc", "key": "span_id" }, "severity": { "$resolver": "level", "field": "name" }, "message": { "$resolver": "message" }, "threadName": { "$resolver": "thread", "field": "name" }, "callerClass": { "$resolver": "caller", "field": "className" }, "callerLine": { "$resolver": "caller", "field": "lineNumber" }, "mdc": { "$resolver": "mdc" } }
- 在启动参数中添加指定模板路径的属性:
-Dotel.instrumentation.log4j-appender.experimental.json-template-path=/usr/src/app/otel-log-template.json
关键注意点
- 请使用OpenTelemetry Java Agent 1.20.0及以上版本,这些实验性配置在旧版本中可能不存在。
- 实验性配置的参数名可能随版本迭代变更,使用前请确认对应版本的特性支持。
- 若同时开启
capture-call-stack和自定义模板,模板中的caller解析器会优先使用捕获到的调用信息。
内容的提问来源于stack exchange,提问作者Руслан Гильмутдинов
相关产品推荐
相关产品推荐

