我在类路径中有一个 log4j2.xml 配置文件。其中一个附加程序是文件附加程序,我想在 Java 应用程序的运行时设置目标文件名。
根据docs我应该可以在 log4j2.xml 文件中使用双“$”和上下文前缀:
<appenders>
<File name="MyFile" fileName="$${sys:logFilename}">
<PatternLayout pattern="%-4r %d{${datestamp}} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</appenders>
其中“sys”前缀表示配置器将在系统属性中查找属性“logFilename”。所以在应用程序中,我调用(相当早):
System.setProperty("logFilename", filename);
我还在 xml 文件中开启了 log4j2 的自动重新配置:
<configuration status="debug" monitorInterval="5">>
不幸的是,这没有任何效果,并且永远不会创建日志文件。部分 log4j2 状态输出如下:
2013-02-13 15:36:37,574 DEBUG Calling createAppender on class org.apache.logging.log4j.core.appender.FileAppender for element File with params(fileName="${sys:logFilename}", append="null", locking="null", name="MyFile", immediateFlush="null", suppressExceptions="null", bufferedIO="null", PatternLayout(%-4r %d{yyyy-MM-dd/HH:mm:ss.SSS/zzz} [%t] %-5level %logger{36} - %msg%n), null)
2013-02-13 15:36:37,576 DEBUG Starting FileManager ${sys:logFilename}
如何在运行时设置 File Appender 中“fileName”的值? 或者,如何在运行时简单地将新的 File Appender 添加到根记录器?在 Log4j 2.0 中大部分用于更改配置的 API 都是隐藏的。
最佳答案
h/t rgoers FileAppender 不支持文件名上的两个美元符号,因为在启动 appender 时打开了文件。您用两个美元符号表示的是您希望(可能)为每个事件使用不同的文件名。
使用单个 $(如 ${sys:logFilename}
),系统将在系统属性中查找属性“logFilename”。
因此,log4j2.xml 应该有:
<appenders>
<File name="MyFile" fileName="${sys:logFilename}">
<PatternLayout pattern="%-4r %d{${datestamp}} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</appenders>
Java 应用程序应该设置系统属性:
System.setProperty("logFilename", filename);
和重新配置记录器:
org.apache.logging.log4j.core.LoggerContext ctx =
(org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false);
ctx.reconfigure();
这会产生所需的行为。
关于java - Log4J2 - 在运行时分配文件附加程序文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14862770/