在运行时修改现有的log4j2 FileAppender配置

时间:2018-07-11 04:58:40

标签: log4j2 fileappender

我正在将应用程序(巨大的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

感谢您的帮助。让我知道您是否有想法。

1 个答案:

答案 0 :(得分:0)

  

在运行时,我想更改文件

您可以将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将包含第二条消息。

希望这会有所帮助!