java - Log4J2 - 在运行时分配文件附加程序文件名

标签 java log4j log4j2

我在类路径中有一个 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/

相关文章:

java - 我应该在 log4j 中哪里使用 Configuration 或 LoggerConfig?

java - 如何使用房间数据库使进度条影响 UI 上的数据?

java - Android:相同的代码行无法在单独的方法中工作

service - 在 OutFaultInterceptor for CXF Web 服务上记录错误的请求 xml

java - log4j2 RollingFile Appender 不更改 Tomcat 上的文件名?

java - 使用 Log4j 和 slf4j 日志文件中没有输出

java - 卡在 Java 递归难题上

java - Android - Java - 获取 JSONObject 中的第 n 个元素

java - 如何停止 log4j 的控制台输出?当前代码将输出到文件和控制台

java - 如何让 Log4j 每天创建新的日志文件?