【问题标题】:Log4j - File is created every time I run my program, but I only want it to create a file when the log level is Errror and upLog4j - 每次运行程序时都会创建文件,但我只希望它在日志级别为 Errror 及以上时创建文件
【发布时间】:2016-02-26 11:27:27
【问题描述】:

在尝试使用 Log4j 时,我有两个 Appender,我想用它们做不同的事情。

我有一个应该记录错误级别和一个文件,另一个应该记录所有内容,无论控制台的级别如何。

控制台 Appender 似乎可以工作,但每次我启动程序时,即使我没有记录任何错误,错误 Appender 都会继续创建新文件。我尝试在错误 Appender 中将 Threshold 设置为 ERROR,但每次运行程序时仍会创建该文件,但其中没有任何内容。

我的问题:我希望 Error Appender 在记录错误之前不要创建新文件。现在,即使没有记录任何错误消息,也会创建一个新的错误文件。

我正在使用 log4j 版本 1.2.17,如果这有影响的话。

这是我的代码。非常感谢您的帮助!

Java:

public final class Sandbox {

    private static final Logger logger = Logger.getLogger(Sandbox.class);
    private static Sandbox instance;

    public Sandbox() {
        Thread.setDefaultUncaughtExceptionHandler(new ErrorFileLogger());
        instance = this;
        System.setProperty("file.date.format", Util.getDate("yyyy-MM-dd_HH-mm-ss"));
        DOMConfigurator.configure("log4j.xml");
//      PropertyConfigurator.configure("log4j.properties");
        logger.info("Creating " + Info.NAME + " " + Info.VERSION + " by " + Info.AUTHOR);
    }
}

public class ErrorFileLogger implements Thread.UncaughtExceptionHandler {

    private static Logger logger;
    private static final String s = System.lineSeparator();

    @Override
    public void uncaughtException(Thread t, Throwable e) {
        logError(this.getClass(), t, e);
    }

    /**
     * Should be called when an uncaught exception is thrown or a caught exception is thrown.
     * @param c: The class where the error is coming from.
     * @param t: The thread the error occurred on.
     * @param e: The throwable, or actual error itself.
     */
    public static void logError(Class<?> c, Thread t, Throwable e) {
        logger = Logger.getLogger(c);
        logger.error(s + "---------- Sandbox Error Report ----------" + s + s + Util.getDate("dd/MM/yyyy HH:mm:ss")
                + s + s +"Uh oh, I'm going down. Save your self!" + s + s
                + "Details about the crash is listed below" + s
                + "---------------------------------------" + s + s +
                t.getName(), e);
    }
}

xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <!-- Error -->
    <appender name="ErrorFile"
         class="org.apache.log4j.RollingFileAppender">
        <param name="Threshold" value="error"/>
        <param name="file" value="./logs/error_report_${file.date.format}.log" />
        <param name="Append" value="false" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%d{HH:mm:ss}] [%p] [%c{1}]: %m%n" />
        </layout>
        <filter class="org.apache.log4j.varia.LevelMatchFilter">
            <param name="LevelToMatch" value="error"/> 
            <param name="AcceptOnMatch" value="true"/> 
        </filter>     
        <filter class="org.apache.log4j.varia.DenyAllFilter"/> 
    </appender>

    <!-- Console -->
    <appender name="Console" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%p] [%c{1}]: %m%n" />
        </layout>

    </appender>


    <root>
        <appender-ref ref="ErrorFile"/>
        <appender-ref ref="Console"/>
    </root>

    </log4j:configuration>

另外,如果有人能解释根是什么以及它的重要性,那就太好了!

非常感谢, 安迪608

【问题讨论】:

    标签: java xml file log4j


    【解决方案1】:

    创建新的错误日志文件是正常行为。您必须将RollingPolicy添加到日志配置中。您可以配置时间频率(每小时创建新的日志文件)或日志文件大小(超过100MB后创建新的) .

    Please check sample config xml from github

    【讨论】:

    • 感谢您的回复和链接!有没有办法在每次记录某些内容时不创建新的错误文件,而仅在记录错误时创建?
    • 我不认为计时器是我正在寻找的,只是在必要时将错误日志打印到新文件中。
    • 据我所知,在启动应用程序时,它正在创建用于写入的空日志文件。
    猜你喜欢
    • 1970-01-01
    • 2015-09-30
    • 2017-07-11
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 2011-01-20
    • 2017-11-28
    相关资源
    最近更新 更多