我正在将应用程序(巨大的Web应用程序)从log4j1.x迁移到log4j 2.11.0。
我需要帮助/说明才能迁移以下方案-
--------场景1 log4j1.x:
<appender name="import_log_file" class="xxxx">
在运行时,我想更改文件,所以我只需要执行appender.setFile(... new file ...)。并做了。 log4j2: 如何迁移上面的代码?
很少有想法,但不是一个直接的答案: 通过LoggerContext创建全新的appender,配置可能是一种方法,但我想更新现有的appender的配置并重新加载log4j2 xml。我该怎么办?
另一种方法可能是重新定义这样的内容
<appender name="import_log_file" class="xxxx">
然后在threadcontext中设置“ dynamic_name”属性。但是我丢失了原始的默认文件import.log
感谢您的帮助。让我知道您是否有想法。
答案 0 :(得分:0)
在运行时,我想更改文件
您可以将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将包含第二条消息。
希望这会有所帮助!