【问题标题】:Modify existing log4j2 FileAppender configuration during runtime在运行时修改现有的 log4j2 FileAppender 配置
【发布时间】:2018-12-19 00:37:57
【问题描述】:

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

我需要帮助/说明以迁移以下场景 -

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

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

在运行时我想更改文件,所以我只需执行 appender.setFile(...new file...)。并做了。 日志4j2: 如何迁移以上代码?

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

另一种方式可能是重新定义类似的东西

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

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

感谢任何帮助。如果您有想法,请告诉我。

【问题讨论】:

    标签: log4j2 fileappender


    【解决方案1】:

    在运行时我想更改文件

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

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2016-08-21
      • 2013-09-25
      • 2012-07-11
      • 2020-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      相关资源
      最近更新 更多