アプリケーションが実行されている間はログをロールオーバーしたいのですが、アプリケーションが再起動されたときにログを新しく開始します。
更新: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" />
起動時にベースログファイルが切り捨てられるようになりましたが、ロールされたファイルはそのまま残ります。
append
パラメータをfalse
に設定すると、アプリケーションの再起動時にベースログファイルが「新しく開始」されます。 「ロールされた」ログファイルも削除したいということですか?
私は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();
}
}
}
}