将变量添加到所有日志消息中

Adding a variable into all log messages

我正在使用 org.slf4j:slf4j-api:1.7.26 从 Java 应用程序写入日志。我的 log4j.properties 看起来像:

log4j.rootLogger=WARN, console

# add a ConsoleAppender to the logger stdout to write to the console
log4j.appender.console=org.apache.log4j.ConsoleAppender
# use a simple message format
log4j.appender.console.layout=org.apache.log4j.EnhancedPatternLayout
log4j.appender.console.layout.ConversionPattern={\
  "time":"%d{ISO8601}",\
  "level":"%p",\
  "class":"%c{1.}",\
  "message":"%m",\
  "thread":"%t",\
  "fileName":"PLACEHOLDER_FILE_NAME"\
  }%n

我需要将 PLACEHOLDER_FILE_NAME 替换为在启动时作为 CLA 提供给应用程序的文件的名称。而是如何做到这一点?我调查了 java.util.logging.Formatter 但我不认为这是最好的方法,因为它似乎覆盖了 log4j.properties.

您可以阅读系统 属性 例如。 ${file.name} 在 log4j 配置中: 然后,你只需要在 log4j 读取这个配置之前设置这个 属性 例如。在启动时将其指定为 -Dfile.name=filenamePath

log4j.rootLogger=WARN, console

# add a ConsoleAppender to the logger stdout to write to the console
log4j.appender.console=org.apache.log4j.ConsoleAppender
# use a simple message format
log4j.appender.console.layout=org.apache.log4j.EnhancedPatternLayout
log4j.appender.console.layout.ConversionPattern={\
  "time":"%d{ISO8601}",\
  "level":"%p",\
  "class":"%c{1.}",\
  "message":"%m",\
  "thread":"%t",\
  "fileName":"${file.name}"\
  }%n