我在类路径中有一个log4j2.xml配置文件.其中一个appender是File appender,我想在Java应用程序中的运行时设置目标文件名.
根据文档,我应该能够在log4j2.xml文件中使用双"$"和上下文前缀:
<appenders>
<File name="MyFile" fileName="$${sys:logFilename}">
<PatternLayout pattern="%-4r %d{${datestamp}} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</appenders>
Run Code Online (Sandbox Code Playgroud)
其中"sys"前缀表示Configurator将在系统属性中查找属性"logFilename".所以在应用程序中,我打电话(相当早):
System.setProperty("logFilename", filename);
Run Code Online (Sandbox Code Playgroud)
我还在xml文件中打开了log4j2的自动重新配置:
<configuration status="debug" monitorInterval="5">>
Run Code Online (Sandbox Code Playgroud)
不幸的是,这没有任何效果,并且永远不会创建日志文件.一些log4j2状态输出如下:
2013-02-13 15:36:37,574 DEBUG在类org.apache.logging.log4j.core.appender.FileAppender上调用createAppender for element 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启动FileManager $ {sys:logFilename}
如何在运行时设置File Appender中的"fileName"值? 或者,如何在运行时向根记录器添加新的File Appender?在Log4j 2.0中,大多数用于更改配置的API都是隐藏的.
是否可以使用XML配置中的规范以编程方式添加Log4J2 appender?
我打算在log4j2.xml中定义它,然后像这样选择appender(不会编译):
if (arg[0].equals("log") ) {
Logger.getLogger("loggerNameFromXMLConfig").addAppender("appenderNameFromXMLConfig");
} else {
//...
}
Run Code Online (Sandbox Code Playgroud) 如何在运行时通过java在log4j2中动态打开或关闭rootLogger的一个appender?
例如,我想禁用Console Appender:
...
<Loggers>
<Root level="INFO">
<AppenderRef ref="Console"/>
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
...
Run Code Online (Sandbox Code Playgroud)
可能吗?