在 JsonLayout 中添加 MDC 变量 - log4j2

omj*_*ego 7 logging mdc log4j2 spring-boot

如何在log4j2的JsonLayout生成的json日志中添加MDC变量。我已经使用 KeyValuePair 标记将主机名等属性添加到日志中,但我没有找到任何方法将 MDC 变量添加到其中。在模式布局中,我使用了 %X{traceId} 但我确定 JsonLayout 无法解析这些转换字符(据我所知,转换字符仅用于模式布局)。我进入了 JsonLayout 的源代码,但没有找到实际上将所有数据放入日志消息的函数。

谢谢你。

D.B*_*.B. 10

您正在寻找的是log4j2 lookup。听起来您对上下文映射查找特别感兴趣,正如您提到的 MDC(ThreadContext顺便说一下,它现在在 log4j2 中被调用)。

这是一个简单的例子:

package example;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.ThreadContext;

public class ThreadContextExample {

    private static final Logger log = LogManager.getLogger();

    public static void main(String[] args) {
        ThreadContext.put("myKey", "myValue");
        log.info("Here's a message!");
    }
}
Run Code Online (Sandbox Code Playgroud)

这是 log4j2.xml 配置:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <JsonLayout compact="false" eventEol="false" stacktraceAsString="true">
                <KeyValuePair key="myJsonKey" value="${ctx:myKey}"/>
            </JsonLayout>
        </Console>

    </Appenders>

    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>
Run Code Online (Sandbox Code Playgroud)

最后是一些示例输出(为了可读性而缩短):

{
  "thread" : "main",
  "level" : "INFO",
  "loggerName" : "example.ThreadContextExample",
  "message" : "Here's a message!",
  ...
  "myJsonKey" : "myValue"
}
Run Code Online (Sandbox Code Playgroud)

  • 使用值字段的更好方法是 $${ctx:myKey:-}。即使值为空,json 键也会存在,但是 ctx:myKey 不会出现在日志中,只是一个空字符串。 (4认同)