web-dev-qa-db-ja.com

過去7日間のログファイルのみを保持するようにlog4jを構成する方法

ロギングに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を使用してこのような動作を構成することは可能ですか?そうでない場合、この種のロギングの問題に対する別のエレガントなソリューションを知っていますか?

53
asmaier

ハウスキーピングは、cronで毎日実行することができる別のスクリプトで実行できます。このようなもの:

find /path/to/logs -type f -mtime +7 -exec rm -f {} \;
25
dogbane

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
55
dty

次の投稿によると、log4jでこれを行うことはできません: se DailyRollingFileAppender -log4j

私の知る限り、この機能はlog4j 2.0に組み込まれるはずでしたが、その努力は脇道に追い込まれました。 logback Webサイトによると、logbackはlog4jの後継となることを意図しているので、log4jの使用を検討するかもしれません。

ロギングに共通のAPIを提供するSLF4JというAPIがあります。実行時に実際のロギング実装をロードするため、指定した構成に応じて、Java.util.logまたはlog4jまたはlogbackまたはロギング機能を提供できるその他のライブラリを使用する場合があります。 log4jの直接使用からSLF4Jの使用に移行するための先行作業が少しありますが、このプロセスを自動化するためのツールがいくつか用意されています。 SLF4Jを使用するようにコードを変換したら、設定ファイルを変更するだけでロギングバックエンドを切り替えることができます。

15
PhilDin

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>
6
skim

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

4
Qwerky

私はこのアペンダーに出会いました 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"))
3
Green Man

別のオプション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機能ではないようです。

3
user444904

設定log4j.appender.FILE.RollingPolicy.FileNamePatternを使用します。例: log4j.appender.FILE.RollingPolicy.FileNamePattern=F:/logs/filename.log.%d{dd}.gzは、ロールオーバーの1か月前にログを保持します。

確認するのに1か月待たなかったが、mm(つまり分)で試し、上書きを確認したので、すべてのパターンで機能すると仮定しています。

2
Ketan K Shah

Linuxを使用している場合、tmpwatchを使用してcronジョブを構成できます。

ほとんどのLinuxシステムには、/ tmpディレクトリをクリーンアップするtmpwatch cronジョブがあります。ロギングディレクトリを監視し、7日以上経過したファイルを削除する別のものを追加できます。

別のシステムを使用している場合、おそらく同等のユーティリティがあります。

1
emory

Chroneジョブを開始するにもかかわらず、タスクでは、logstashのconfigフォルダーにあるlog4j2.propertiesファイルを使用できます。以下のリンクをご覧ください。これは役に立ちます。

https://github.com/elastic/logstash/issues/7482

0
Vaibhav Jain