我在项目中使用log4j FileAppender来收集某些结果。当我的应用程序重新启动时,我想保留以前的结果文件并开始一个新的结果文件。这可能吗?
例如:
我检查了DailyRollingFileAppender,但这不是我真正需要的,因为它会在特定日期设置下自动翻转。我需要在应用程序重新启动时进行翻转。
答案 0 :(得分:1)
如何让您的应用程序动态设置日志文件?您可以通过在应用程序启动时以编程方式创建文件追加程序并将其附加到当前记录器来执行此操作。
例如,以下代码将根据当前时间创建新的日志文件。例如results_1336482894.log
,results_1336486780.log
Date now = new Date();
FileAppender myFileAppender = new FileAppender();
myFileAppender.setName("myFileAppender");
myFileAppender.setFile("results_" + now.getTime() + ".log");
myFileAppender.setLayout(new PatternLayout("%d %-5p [%t]: %m%n"));
myFileAppender.setThreshold(Level.DEBUG);
myFileAppender.activateOptions();
Logger myLogger = Logger.getLogger("name of your logger"); //Or use getRootLogger() instead
myLogger.addAppender(myFileAppender);
答案 1 :(得分:1)
我通过编写自己的appender解决了这个问题:
import org.apache.log4j.RollingFileAppender;
/**
This appender rolls over at program start.
This is for creating a clean boundary between log data of different runs.
*/
public class RunRolledFileAppender
extends RollingFileAppender
{
public RunRolledFileAppender() { }
@Override
public void activateOptions() {
super.activateOptions();
super.rollOver();
}
@Override
public void rollOver() { }
}
注意,必须使用难看的rollOver()禁用,因为MaxFileSize设置不起作用,并且Appender也会每10MB翻转一次,这是我不需要的。
答案 2 :(得分:0)
您可以使用ExternallyRolledFileAppender
和Roller
类在应用程序启动时翻转日志文件。
这是一个示例类:
import org.apache.log4j.Logger;
import org.apache.log4j.varia.Roller;
public class Test {
private static final Logger log = Logger.getLogger(Test.class);
public static void main(final String[] args) {
Roller.main(new String[] {"localhost", "9999"});
log.debug("Started application!");
}
}
示例log4j.properties
文件:
log4j.appender.file=org.apache.log4j.varia.ExternallyRolledFileAppender
log4j.appender.file.File=app.log
log4j.appender.file.Port=9999
log4j.appender.file.MaxBackupIndex=5
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-5p: %t: %c: %m%n
log4j.rootLogger=DEBUG, file
注意ExternallyRolledFileAppender
中的警告:
请注意,启动器未经过身份验证。任何人都可以触发翻转。在生产环境中,建议您添加某种形式的保护以防止意外的翻转。
如果这不符合您的需求,那么创建您自己的类似Appender
实现应该是微不足道的。
答案 3 :(得分:0)
Log4j2
的{{1}}具有称为RollingFileAppender
的策略。
文档说明:
如果日志文件早于当前JVM的启动时间并且达到或超过了最小文件大小,则
OnStartupTriggeringPolicy
策略将导致过渡。
OnStartupTriggeringPolicy
配置示例(仅xml
):
Policies
更多信息和文档: https://logging.apache.org/log4j/2.x/manual/appenders.html#RollingFileAppender