39

只要应用程序正在运行,我希望日志滚动,但我希望日志在应用程序重新启动时重新开始。

更新: 根据erickson 的反馈,我的 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" />

现在它会在启动时截断基本日志文件,但它会单独保留滚动文件。

4

2 回答 2

46

如果您将append参数设置为false,则当应用程序重新启动时,基本日志文件将“重新启动”。你的意思是你想删除任何“滚动”的日志文件吗?

于 2008-11-06T19:53:32.277 回答
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();
      }
    }
  }
}
于 2009-01-30T18:58:56.413 回答