web-dev-qa-db-ja.com

起動時にlog4jでログをクリアするにはどうすればよいですか?

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

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

   <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" />

起動時にベースログファイルが切り捨てられるようになりましたが、ロールされたファイルはそのまま残ります。

35
braveterry

appendパラメータをfalseに設定すると、アプリケーションの再起動時にベースログファイルが「新しく開始」されます。 「ロールされた」ログファイルも削除したいということですか?

40
erickson

私は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();
      }
    }
  }
}
5
Eddie