ロギングにlog4j
を使用するいくつかのJavaアプリケーションで以下のロギングの問題があります。
ログファイルを毎日ローテーションしたい
log.2010-09-10
log.2010-09-09
log.2010-09-08
log.2010-09-07
log.2010-09-06
log.2010-09-05
log.2010-09-04
しかし、データセキュリティ上の理由から、ログファイルを会社で7日間以上保管することは許可されていません。そのため、次の次のログファイルlog.2010-09-11
が生成されると、log.2010-09-04
が削除されます。 log4j
を使用してこのような動作を構成することは可能ですか?そうでない場合、この種のロギングの問題に対する別のエレガントなソリューションを知っていますか?
ハウスキーピングは、cronで毎日実行することができる別のスクリプトで実行できます。このようなもの:
find /path/to/logs -type f -mtime +7 -exec rm -f {} \;
RollingFileAppenderを使用していると思いますか?その場合、MaxBackupIndex
というプロパティがあり、これを設定してファイル数を制限できます。例えば:
log4j.appender.R=org.Apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=7
log4j.appender.R.layout=org.Apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
次の投稿によると、log4jでこれを行うことはできません: se DailyRollingFileAppender -log4j
私の知る限り、この機能はlog4j 2.0に組み込まれるはずでしたが、その努力は脇道に追い込まれました。 logback Webサイトによると、logbackはlog4jの後継となることを意図しているので、log4jの使用を検討するかもしれません。
ロギングに共通のAPIを提供するSLF4JというAPIがあります。実行時に実際のロギング実装をロードするため、指定した構成に応じて、Java.util.logまたはlog4jまたはlogbackまたはロギング機能を提供できるその他のライブラリを使用する場合があります。 log4jの直接使用からSLF4Jの使用に移行するための先行作業が少しありますが、このプロセスを自動化するためのツールがいくつか用意されています。 SLF4Jを使用するようにコードを変換したら、設定ファイルを変更するだけでロギングバックエンドを切り替えることができます。
log2jは、古いログの削除をサポートするようになりました。 DefaultRolloverStrategyタグと以下のスニペットをご覧ください。同じ日に最大10個のアーカイブを作成し、「app-*。log.gz」に一致するログファイル名で最大深さ2のPropertiesタグで定義した$ {baseDir}ディレクトリを解析し、7より古いログを削除します。最新の5つのログが7日より古い場合、最新の5つのログを保持します。
<DefaultRolloverStrategy max="10">
<Delete basePath="${baseDir}" maxDepth="2">
<IfFileName glob="*/app-*.log.gz">
<IfLastModified age="7d">
<IfAny>
<IfAccumulatedFileCount exceeds="5" />
</IfAny>
</IfLastModified>
</IfFileName>
</Delete>
</DefaultRolloverStrategy>
DailyRollingFileAppenderもあります。 http://logging.Apache.org/log4j/1.2/apidocs/org/Apache/log4j/DailyRollingFileAppender.html
編集:この心配な声明を読んだ後。
DailyRollingFileAppenderは、同期の問題とデータ損失を示すことが確認されています。 log4j extrasコンパニオンには、新しいデプロイメントで考慮する必要がある代替案が含まれており、org.Apache.log4j.rolling.RollingFileAppenderのドキュメントで説明されています。
上記のURL(私はこれまで気づかなかった)から、これはより良い賭けのように見えます。 http://logging.Apache.org/log4j/companions/extras/apidocs/index.html
私はこのアペンダーに出会いました here それはあなたが望むことをします、日付によってロールオーバーされた特定の数のファイルを保持するように設定できます。
ダウンロード: http://www.simonsite.org.uk/download.htm
例(グルーヴィー):
new TimeAndSizeRollingAppender(name: 'timeAndSizeRollingAppender',
file: 'logs/app.log', datePattern: '.yyyy-MM-dd',
maxRollFileCount: 7, compressionAlgorithm: 'GZ',
compressionMinQueueSize: 2,
layout: pattern(conversionPattern: "%d [%t] %-5p %c{2} %x - %m%n"))
別のオプションDailyRollingFileAppenderがあります。しかし、それはあなたが探している自動削除(7日間のログを保持)機能が欠けています
サンプル
log4j.appender.DRF=org.Apache.log4j.DailyRollingFileAppender
log4j.appender.DRF.File=example.log
log4j.appender.DRF.DatePattern='.'yyyy-MM-dd
org.Apache.log4j.CompositeRollingAppenderという何かに出くわします。これはRollingFileAppender(maxSizeRollBackups、バックアップファイルの数)およびDailyRollingFileAppender(日ごとにロール)。
しかし、それを試していませんが、標準の1.2ブランチのlog4j機能ではないようです。
設定log4j.appender.FILE.RollingPolicy.FileNamePattern
を使用します。例: log4j.appender.FILE.RollingPolicy.FileNamePattern=F:/logs/filename.log.%d{dd}.gz
は、ロールオーバーの1か月前にログを保持します。
確認するのに1か月待たなかったが、mm(つまり分)で試し、上書きを確認したので、すべてのパターンで機能すると仮定しています。
Linuxを使用している場合、tmpwatchを使用してcronジョブを構成できます。
ほとんどのLinuxシステムには、/ tmpディレクトリをクリーンアップするtmpwatch cronジョブがあります。ロギングディレクトリを監視し、7日以上経過したファイルを削除する別のものを追加できます。
別のシステムを使用している場合、おそらく同等のユーティリティがあります。
Chroneジョブを開始するにもかかわらず、タスクでは、logstashのconfigフォルダーにあるlog4j2.propertiesファイルを使用できます。以下のリンクをご覧ください。これは役に立ちます。