繁体   English   中英

如何延迟日志文件的创建,直到以编程方式为 log4j2 设置 Appender 文件名

[英]How to delay log file creation until Appender fileName is set programmatically for log4j2

我有一个项目,其 xml 中定义了 log4j 属性。

<?xml version="1.0" encoding="UTF-8" ?>
    <Configuration>
        <Appenders>
            <File name="LogFileAppender" fileName="${sys:logFileName:-default}" append="false">
                <PatternLayout>
                    <Pattern>%d [%t] %p - %m%n</Pattern>
                </PatternLayout>
            </File>
        </Appenders>
    
        <Loggers>
            <Root level="error">
                <AppenderRef ref="LogFileAppender"/>
            </Root>
        </Loggers>
    </Configuration>

在发生任何日志记录以获取正确的 output 文件夹之前,我将fileName值更新为代码中的正确路径。

public static void initializeLoggers(String logPath)
{
    // set output paths for log files
    System.setProperty("logFileName", logPath + "PROJECT.log");

    // reconfigure loggers with paths
    org.apache.logging.log4j.core.LoggerContext ctx =
            (org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false);
    ctx.reconfigure();
}

在大多数情况下,一切都按预期工作。 日志文件是 output 到正确的 logPath 并写出数据。 但是,在我们到达 initializeLoggers() 之前,默认项目目录中创建了一个名为“default”的文件,因为调用

static Logger log = LogManager.getLogger(MyClass.class); // Logging

在代码的顶部。

我发现不生成“默认文件”,只需将字段留为空白,如下所示:

fileName="${sys:logFileName:-}"

但是在这样做时,代码会抱怨并给出错误,因为该属性在该特定时间是 null。

2022-01-19 13:07:51,936 main ERROR The parameter is null: fileName 2022-01-19 13:07:51,944 main ERROR Could not create plugin of type class org.apache.logging.log4j.core.appender.FileAppender for element File org.apache.logging.log4j.core.config.ConfigurationException: Arguments given for element File are invalid: field 'fileName' has invalid value '' at org.apache.logging.log4j.core.config.plugins.util .PluginBuilder.injectFields(PluginBuilder.java:210)

有什么办法可以解决这个问题

  • 不生成未使用的“默认文件”
  • 没有关于 null 值的错误

如果要延迟Log4j的初始化,需要谨慎控制LogManager.getLogger等类似方法的使用。 例如,您不应在class 中使用 static Logger字段,而应仅初始化日志记录后调用LogManager.getLogger

这可能有点棘手,但系统属性log4j2.loggerContextStacktraceOnStart可以帮助您。

一种更简单的方法是将配置文件从自动配置过程中移开,例如通过调用它myapp-log4j2.xml 这样,第一个配置将使用默认配置(仅使用控制台附加程序),您可以在设置适当的系统变量后重新配置它:

  private static final String CONFIG_FILE = "myapp-log4j2.xml";

  public static void initializeLoggers(String logPath) {
    final ClassLoader tccl = Thread.currentThread().getContextClassLoader();
    final ClassLoader cl = getClass().getClassLoader();
    final URL resource = tccl != null ? tccl.getResource(CONFIG_FILE)
        : cl != null ? cl.getResource(CONFIG_FILE) : ClassLoader.getSystemResource(CONFIG_FILE);
    if (resource != null) {
      System.setProperty("logFileName", logPath + "PROJECT.log");
      Configurator.reconfigure(resource.toURI());
    }
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM