-1

我正在将应用程序(大型 Web 应用程序)从 log4j1.x 迁移到 log4j 2.11.0。

我需要帮助/澄清来迁移以下场景 -

--------场景1 log4j1.x:

<appender name="import_log_file" class="xxxx">

在运行时我想更改文件,所以我只会做 appender.setFile(...new file...)。并做了。log4j2:我如何迁移上面的代码?

几个想法,但不是一个直接的答案:通过 LoggerContext 创建全新的附加程序,配置可能是一种方式,但我想更新现有附加程序的配置并重新加载 log4j2 xml。我怎么做?

另一种方法可能是重新定义这样的东西

<appender name="import_log_file" class="xxxx">

然后在线程上下文中设置“dynamic_name”属性。但是我丢失了原始默认文件 import.log

任何帮助表示赞赏。让我知道你是否有想法。

4

1 回答 1

0

在运行时我想更改文件

您可以将RoutingAppender查找一起使用来执行此操作。有关详细信息,请参阅log4j2 常见问题页面

这是一个非常简单的示例,说明如何在运行时更改日志文件名:

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

希望这可以帮助!

于 2018-07-14T17:34:15.677 回答