Log4j - 每次运行我的程序时都会创建文件,但我只希望它在日志级别为Errror并且

时间:2015-11-24 06:10:55

标签: java xml file log4j

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

我有一个应该记录ERROR级别和一个文件,另一个应该记录所有内容,无论级别到控制台。

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

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

我正在使用log4j 1.2.17版本,如果这有所不同。

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

爪哇:

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>

此外,如果有人能够解释根本是什么,它的重要性会很棒!

非常感谢, Andy608

1 个答案:

答案 0 :(得分:0)

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

Please check sample config xml from github