本文介绍了在运行时修改现有的log4j2 FileAppender配置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在将应用程序(大型Web应用程序)从log4j1.x迁移到log4j 2.11.0。我需要帮助/澄清才能迁移以下方案-
-场景1Log4j1.x:<appender name="import_log_file" class="xxxx">
在运行时,我想要更改文件,因此我只需要执行appendder.setFile...(...new file...)。完事了。Log4j2:如何迁移以上代码?
有几个想法,但没有一个直接的答案:通过LoggerContext创建全新的附加器,配置可能是一种方法,但我想更新现有附加器的配置并重新加载log4j2XML。我该怎么做?
另一种方法可以重新定义类似的内容
<appender name="import_log_file" class="xxxx">
并在线程上下文中设置"DYNAMIC_NAME"属性。但我正在丢失原始默认文件port.log
如有任何帮助,我们不胜感激。如果您有想法,请告诉我。
推荐答案
您可以将RoutingAppender
与lookup一起使用来完成此操作。有关详细信息,请参阅log4j2 FAQ page。下面是一个非常简单的示例,说明如何在运行时更改日志文件名:
package pkg;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.ThreadContext;
public class Log4j2DiffFilePerCtxVarMain {
private static final Logger LOG = LogManager.getLogger();
public static void main(String[] args){
ThreadContext.put("myFileNameVar", "file1");
LOG.info("This should appear in file1.log");
ThreadContext.put("myFileNameVar", "file2");
LOG.info("This should appear in file2.log");
}
}
配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Routing name="myAppender">
<Routes pattern="$${ctx:myFileNameVar}">
<Route>
<File
fileName="logs/${ctx:myFileNameVar}.log"
name="myAppender-${ctx:myFileNameVar}">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</Route>
</Routes>
</Routing>
</Appenders>
<Loggers>
<Root level="trace">
<AppenderRef ref="myAppender" />
</Root>
</Loggers>
</Configuration>
运行上述代码的结果将是两个文件--file1.log和file2.log,每个文件都有一个条目。File1.log将包含第一条日志消息,而file2.log将包含第二条消息。希望这能有所帮助!
这篇关于在运行时修改现有的log4j2 FileAppender配置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!