只要应用程序正在运行,我希望日志能够翻转,但我希望在重新启动应用程序时重启新日志。
更新: 基于erickson's反馈,我的appender看起来像这样:
<appender name="myRFA" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="my-server.log"/>
<param name="Append" value="false" />
<param name="MaxFileSize" value="10MB"/>
<param name="MaxBackupIndex" value="10"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d{ISO8601} %p - %t - %c - %m%n"/>
</layout>
</appender>
我只是添加了以下一行:
<param name="Append" value="false" />
它现在会在启动时截断基本日志文件,但它会单独保留已滚动的文件。
答案 0 :(得分:39)
如果将append
参数设置为false
,则在应用程序重新启动时,基本日志文件将“重新启动”。你的意思是你想要删除任何“滚动”的日志文件吗?
答案 1 :(得分:5)
我已经编写了一些自定义代码来查找我的RollingFileAppender
(在log4j中获取访问权限是不必要的!)然后我将其翻转。我已将我的代码改编为一次使用。我在应用程序启动时使用与此类似的代码来强制我的日志滚动(如果非空),所以我总是从一个新的日志开始,但从不删除任何日志,但最旧的。
此代码使用给定的Logger并循环记录器层次结构,直到找到附加了Appender的Logger。如果它永远不会,那么它就会放弃。如果是,它会遍历连接到该Logger的所有Appender,并且对于每个作为RollingFileAppender的Appender,它会强制日志滚动。
像这样的东西应该在log4j中更容易做,但我还没有找到一种更简单的方法。
public void rollLogFile(Logger logger) {
while (logger != null && !logger.getAllAppenders().hasMoreElements()) {
logger = (Logger)logger.getParent();
}
if (logger == null) {
return;
}
for (Enumeration e2 = logger.getAllAppenders(); e2.hasMoreElements();) {
final Appender appender = (Appender)e2.nextElement();
if (appender instanceof RollingFileAppender) {
final RollingFileAppender rfa = (RollingFileAppender)appender;
final File logFile = new File(rfa.getFile());
if (logFile.length() > 0) {
rfa.rollOver();
}
}
}
}