Apache commons ロギング ライブラリと log4j を使用してログ ファイルを生成しています。
プログラムを実行するたびに新しいファイルを作成したいと考えています。現在のカウントをログ ファイルの名前に追加する必要があります。
例: program_1.log program_2.log program_3.log
どうすればこれを達成できるか知っていますか?
Apache commons ロギング ライブラリと log4j を使用してログ ファイルを生成しています。
プログラムを実行するたびに新しいファイルを作成したいと考えています。現在のカウントをログ ファイルの名前に追加する必要があります。
例: program_1.log program_2.log program_3.log
どうすればこれを達成できるか知っていますか?
Turning my comment into an answer, as requested:
Any reason why you don't want to use a timestamp? I've found them to be more meaningful as suffixes when I have to look back at log files.
これは log4j ではサポートされていないと思うので、FileAppender を拡張して独自の実装を作成する必要があります。
public class CustomAppender extends FileAppender {
...
public
CustomAppender(Layout layout, String filename, boolean append, boolean bufferedIO,
int bufferSize) throws IOException {
this.layout = layout;
// file name will be the basis; you should calculate the suffix yourself
customname = filename + ...
this.setFile(customname, append, bufferedIO, bufferSize);
}
...
この記事では、動的に決定されるログ ファイルに書き込む方法の例を示します。これにより、プログラムの開始時に必要なファイル名を柔軟に決定できます。
最も難しい部分は、現在のカウントが何であるかを知ることです。ファイル名のバイナリ検索を実行して最大数のファイル名を見つけるのがおそらく最も簡単です。これはそれほど悪くはありません。ログ n 個のファイル存在テストが必要です。ここで、n はログの数です。100 万のログがある場合、それはわずか 20 のファイル チェックです。
これは私のために働く、
<appender name="fileAppender" class="org.apache.log4j.DailyRollingFileAppender">
<param name="Threshold" value="TRACE" />
<param name="File" value="amLog.log"/>
<param name="DatePattern" value="'.'YYYY-MM-dd-HH-mm"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p [%c{1}] %m %n" />
</layout>
普通の Log4J はこれをサポートしていないようです。ただし、独自のRollingFileAppenderを含む Log4J Extras Companion があり、 RollingPolicyおよびTriggeringPolicyパラメーターを介して非常に自由に構成できるようです。したがって、独自のポリシーを実装してみることができます。
JVM インスタンスごとに新しいファイルを作成するつもりだと仮定します。FileAppenderを拡張することで、それを実装できると思います(簡単ではありませんが、難しくはありません)。DatedFileAppenderのコードを参照して、インスピレーションを得ることができます。
あまり洗練されていない方法として、プログラムが実行されるたびにファイル log_num.dat を作成し、そこで 1 つの数値 (作成する次のログ ファイル) を追跡することができます。