39

アプリケーションが実行されている限りログをロールオーバーしたいのですが、アプリケーションの再起動時にログを新たに開始したいです。

更新:エリクソンのフィードバックに 基づいて、私のアペンダーは次のようになります。

   <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 でアクセスするのが不必要に難しい!) 自分を見つけるためにいくつかのカスタム コードを作成しました。以下のコードを 1 回の使用に合わせて調整しました。私は、アプリケーションの起動時にこれに似たコードを使用して、(空でない場合) ログを強制的にロールするため、常に新しいログから開始しますが、最も古いログ以外は削除しません。

このコードは、特定のロガーを取得し、アペンダーがアタッチされているロガーが見つかるまで、ロガー階層をループします。そうでない場合は、あきらめます。その場合、そのロガーに接続されているすべてのアペンダーをループし、RollingFileAppender である各アペンダーについて、ログを強制的にロールします。

このようなことは、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 に答える