我在我的项目中使用 log4j FileAppender 来收集某些结果。当我的应用程序重新启动时,我想保留以前的结果文件并开始一个新的。那可能吗?
例如:
- 启动应用程序,将结果写入 results.log
- 申请结束
- 重启应用,将结果写入 results_1.log
- ...
我检查了 DailyRollingFileAppender,但这并不是我真正需要的,因为它会在某个日期设置上自动翻转。当应用程序重新启动时,我需要翻转。
我通过编写自己的附加程序解决了这个问题:
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 滚动一次,这是我不需要的。
让您的应用程序动态设置日志文件怎么样?您可以通过在应用程序启动时以编程方式创建文件附加程序并将其附加到当前记录器来实现此目的。
例如,以下代码将根据当前时间创建新的日志文件。例如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);
Log4j2
的RollingFileAppender
有政策叫OnStartupTriggeringPolicy
。
正如文件所述:
OnStartupTriggeringPolicy
如果日志文件早于当前 JVM 的开始时间并且达到或超过最小文件大小,则该策略会导致翻转。
配置示例xml
(仅Policies
):
<Policies>
<OnStartupTriggeringPolicy /> # restart on startup of JVM
<SizeBasedTriggeringPolicy size="20 MB" /> # restart file if log file reaches 20MB
<TimeBasedTriggeringPolicy /> # restart if currend date don't mach date in log file name
</Policies>
更多信息和文档: https ://logging.apache.org/log4j/2.x/manual/appenders.html#RollingFileAppender
您可以在应用程序启动时使用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
实现应该很简单。