本文介绍了在运行时修改现有的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

如有任何帮助,我们不胜感激。如果您有想法,请告诉我。

推荐答案

您可以将RoutingAppenderlookup一起使用来完成此操作。有关详细信息,请参阅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配置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

11-01 11:22