当前位置: 首页 > 知识库问答 >
问题:

Log4j2创建不需要的日志文件

商俊智
2023-03-14

我想设置日志级别、文件名和日志文件的文件路径。我找到了一种方法来实现这一点,除了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");
        }

    }

}

共有2个答案

司雅畅
2023-03-14

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

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

董高畅
2023-03-14

您需要执行以下操作:

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);
}
 类似资料:
  • 我有将日志保存到文件配置,但日志会附加到现有内容。我想创建总是新的文件。我怎么能那样做? 我的log4j2.xml:

  • 我正在使用带有log4j2的Spring Boot1.5.9,当我测试日志记录功能时,创建了日志文件,但没有将日志写入其中,而控制台日志记录程序运行良好。请在pom.xml&log4j2.properties配置下面找到。 log4j2.properties文件:

  • 问题内容: 我当前正在创建一个可以包含模块的系统(将它们视为插件),其中每个模块可以拥有自己的专用日志。 我想使用log4j2项目进行日志记录,但是文件附加器似乎有些麻烦。 主项目(整个模块的模块加载器和“核心”)应具有自己的日志文件,而模块应具有自己的日志文件(如)。 通过阅读有关追加程序的文档,我发现了该类,并且我将使用它。直到我发现不能简单地将追加器添加到由创建的默认记录器中。 LogMan

  • 我目前正在创建一个系统,可以有模块(把它们看作插件),其中每一个都可以有自己的日志,专用的。 我想使用log4j2项目进行日志记录,但我似乎在文件附加符方面遇到了一些麻烦。 主项目(模块加载器和整个事情的“核心”)应该有自己的日志文件,而模块应该有自己的日志文件(像)。 即使搜索也没有给我提供任何接近的解决方案,我找到的只是xml配置中预定义的文件日志--这不是我想要的。 感谢你的阅读;即使是最轻

  • 我已经将log4j2.properties文件与springboot应用程序一起使用。正在创建日志文件,但日志未写入该文件。 日志出现在控制台,但没有写入文件,因为我没有得到问题。 奇怪的是,父包记录器“logger Enabled:Enting main\n\n”被写入文件,而另一个父包记录器“****演示应用程序启动*****”没有被写入文件,如上面的代码所示。并且还检查了子包,即记录器,甚至

  • 正如问题的标题所述,如果log4j2 File appender日志文件不存在,是否可以避免创建父文件夹?实际上,当我通过文件appender日志的不存在的父文件夹时,它将由log4j2自动创建。我已经尝试过查看标记上是否有属性,但什么都没有。 https://logging.apache.org/log4j/2.x/manual/appenders.html