首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Log4J - 运行时变量替换

Log4J 支持在日志消息中插入运行时变量

使用 PropertyPatternConverter

PropertyPatternConverter 允许你在日志消息中插入 Java 系统属性。你可以在 Log4J 配置文件中使用 %p%P 转换符来引用系统属性。

例如,以下 Log4J 配置将打印出当前 Java 版本:

代码语言:javascript
复制
<appender name="console" class="org.apache.log4j.ConsoleAppender">
  <layout class="org.apache.log4j.PatternLayout">
    <param name="ConversionPattern" value="Java Version: %p"/>
  </layout>
</appender>

<root>
  <level value="info"/>
  <appender-ref ref="console"/>
</root>

使用 env 关键字

从 Log4J 2.7 开始,你可以使用 env 关键字来引用环境变量。你可以在 Log4J 配置文件中使用 %env{VAR_NAME} 转换符来引用环境变量。

例如,以下 Log4J 配置将打印出 PATH 环境变量的值:

代码语言:javascript
复制
<appender name="console" class="org.apache.logging.log4j.core.appender.ConsoleAppender">
  <layout class="org.apache.logging.log4j.core.layout.PatternLayout">
    <Pattern>PATH: %env{PATH}</Pattern>
  </layout>
</appender>

<root>
  <level value="info"/>
  <appender-ref ref="console"/>
</root>

使用 ThreadContext

ThreadContext 允许你在日志消息中插入线程局部变量。你可以使用 ThreadContext.put() 方法设置变量,然后在 Log4J 配置文件中使用 %X{VAR_NAME} 转换符来引用它们。

例如,以下代码片段设置了线程局部变量 userId

代码语言:javascript
复制
import org.apache.logging.log4j.ThreadContext;

public class MyClass {
  public void myMethod() {
    ThreadContext.put("userId", "123");
    // ...
  }
}

然后,在 Log4J 配置文件中,你可以使用 %X{userId} 转换符来引用该变量:

代码语言:javascript
复制
<appender name="console" class="org.apache.logging.log4j.core.appender.ConsoleAppiewAppender">
  <layout class="org.apache.logging.log4j.core.layout.PatternLayout">
    <Pattern>User ID: %X{userId}</Pattern>
  </layout>
</appender>

<root>
  <level value="info"/>
  <appender-ref ref="console"/>
</root>

使用 MDC(Mapped Diagnostic Context)

MDCThreadContext 的一个子类,它提供了一种更结构化的方法来存储和检索线程局部变量。你可以使用 MDC.put() 方法设置变量,然后在 Log4J 配置文件中使用 %X{VAR_NAME} 转换符来引用它们。

例如,以下代码片段设置了 MDC 变量 userId

代码语言:javascript
复制
import org.apache.logging.log4j.MDC;

public class MyClass {
  public void myMethod() {
    MDC.put("userId", "123");
    // ...
  }
}

然后,在 Log4J 配置文件中,你可以使用 %X{userId} 转换符来引用该变量:

代码语言:javascript
复制
<appender name="console" class="org.apache.logging.log4j.core.appender.ConsoleAppiewAppender">
  <layout class="org.apache.logging.log4j.core.layout.PatternLayout">
    <Pattern>User ID: %X{userId}</Pattern>
  </layout>
</appender>

<root>
  <level value="info"/>
  <appender-ref ref="console"/>
</root>

通过这些方法,你可以在 Log4J 日志消息中插入运行时变量。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Ghost in the Log4Shell

多年以后,面对加班的夜晚,Volkan Yazıcı 一定会回忆起发生在 2021 年底的这件事情,除了没日没夜的工作和无休止的解释以外,当然也少不了人们的愤怒和对他的谩骂。一不小心就见证历史的,除了 log4j 的作者们,还有我们所有人。起初,大家都度过了一个黑客狂欢,吃瓜群众玩梗,开发们加班的周末,以为这可能是又一次“心脏出血”或者“永恒之蓝”。随着事情愈演愈烈,影响愈来愈大,现在大家都应该认识到,这个漏洞比心脏出血要严重得多。比如 CISA 的官员称其为从业以来最严重的漏洞(之一),log4j 的修复也导致短短两周内升了三个大版本(目前只有最新的 2.17.0 被认为是没有问题的)。所以朋友们,不要怀疑,这绝对是一个有生之年系列。

04
领券