【发布时间】: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
【问题讨论】: