在尝试使用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
答案 0 :(得分:0)
创建新的错误日志文件是正常的行为。您必须将RollingPolicy添加到日志配置中。您可以配置时间频率(每小时创建新的日志文件)或基于日志文件大小(超过100MB后创建新的日志文件)