【问题标题】:Log4j2 creates unwanted logfileLog4j2 创建不需要的日志文件
【发布时间】:2016-05-22 19:37:54
【问题描述】:

我想设置日志级别以及日志文件的文件名和文件路径。我找到了一种方法来做到这一点,这一切都有效,但 log4j 创建了一个附加日志文件。 我得到了以下 log4j2.xml:

    <?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF">
    <Appenders>
        <File name="logFile" filename="${sys:logDir}${sys:logFilename}" >
            <PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %msg%n" />
        </File>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="logFile" />
        </Root>
    </Loggers>
</Configuration>

在我的主函数中,我设置了 ${sys:logDir} 和 ${sys:logFilename}:

    import config.ReadParameterFile;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.LoggerConfig;

import java.io.IOException;

public class main {
private final static Logger log = LogManager.getLogger(main.class);



    public static void main(String [] args) throws IOException {
        ReadParameterFile config = new ReadParameterFile();

        LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
        Configuration config1 = ctx.getConfiguration();
        LoggerConfig loggerConfig = config1.getLoggerConfig(LogManager.ROOT_LOGGER_NAME);


        switch (config.getProtokollProtokollTiefe()){
            case "Default":loggerConfig.setLevel(Level.DEBUG);
                break;
            case "Produktion":loggerConfig.setLevel(Level.ERROR);
                break;
            case "Test":loggerConfig.setLevel(Level.FATAL);
                break;
            default:System.out.print("falsche Logtief");


        }


        System.setProperty("logDir",config.getProtokollDirProtokoll());
        System.setProperty("logFilename", config.getProtokollDateinameProtokoll());
        ctx.reconfigure();
        ctx.updateLoggers();



    }

}

它像我想要的那样工作,但是 log4j 在我的主项目路径中创建了一个名为“${sys:logDir}${sys:logFilename}”的文件。为什么 log4j2 会这样做?我猜它会在我设置名称之前初始化日志文件。怎么改?

此致!

我可以通过以下主要方法解决问题:

public class main {


    public static void main(String [] args) throws IOException {
        ReadParameterFile config = new ReadParameterFile();

        System.setProperty("logDir",config.getProtokollDirProtokoll());
        System.setProperty("logFilename", config.getProtokollDateinameProtokoll());
        switch (config.getProtokollProtokollTiefe()){
            case "Default":System.setProperty("logLvl","DEBUG");
                break;
            case "Produktion":System.setProperty("logLvl","ERROR");
                break;
            case "Test": System.setProperty("logLvl","ALL");
                break;
            default:System.out.print("falsche Logtief");
        }

    }

}

【问题讨论】:

  • 尝试删除private final static Logger log = LogManager.getLogger(main.class);?
  • 您正在使用RollingFile,这意味着将在文件模式定义的特定时间点创建新文件,或者如果文件超过SizeBasedTriggeringPolicy 定义的大小。查看更多配置:logging.apache.org/log4j/2.x/manual/appenders.html
  • @Aris2World 嘿,是的,我已经尝试过了。还是有错误的文件。
  • @Rafal 嘿,我更改了我的 log4j2.xml 文件。但仍然得到了错误的文件。你知道我该如何解决这个问题吗?
  • 每个对 LogManager 的引用都会初始化记录器。你必须改变方法。

标签: java logging configuration log4j log4j2


【解决方案1】:

你需要这样做:

private static ReadParameterFile config;
private static Logger log;
static {
    config = new ReadParameterFile();
    System.setProperty("logDir",config.getProtokollDirProtokoll());
    System.setProperty("logFilename", config.getProtokollDateinameProtokoll());
    log = LogManager.getLogger(main.class);
}

【讨论】:

    【解决方案2】:

    记录器被声明为静态字段。这是在加载类时初始化的,main 方法被调用之前。

    第一次调用LogManager 应该在设置这些系统属性之后进行。 您可以在设置属性后初始化 Logger,也可以在命令行中使用-D 选项设置属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      • 2018-06-28
      • 2014-06-03
      • 1970-01-01
      • 1970-01-01
      • 2019-01-10
      • 1970-01-01
      相关资源
      最近更新 更多