java 設定ファイル - 過去7日間のログファイルのみを保持するようにlog4jを設定するにはどうすればよいですか?




読み込み 使い方 (12)

ロギングに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-11の削除がlog.2010-09-04ます。 log4jこのような動作を設定することは可能ですか? もしそうでなければ、この種のロギングの問題のためのもう一つの洗練されたソリューションをご存知ですか?


Answers

私は設定した:

log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.DatePattern='.'yyyy-MM-dd
# Archive log files (Keep one year of daily files)
log4j.appender.R.MaxBackupIndex=367

私の前の他の人と同じように、DEBUGオプションは私にエラーを示しました:

log4j:WARN org.apache.log4j.DailyRollingFileAppenderの[maxBackupIndex]のようなプロパティはありません。

ここではまだ試していないアイデアがあります。必要な時間が経過した後にファイルが上書きされるようにDatePatternを設定するとします。 1年間の価値を保持するために、私は設定しようとすることができます:

log4j.appender.R.DatePattern='.'MM-dd

それはうまくいくのだろうか、それともエラーを引き起こすだろうか? それが見つかるには1年かかりそうですが、私は試してみることができます:

log4j.appender.R.DatePattern='.'dd

見つけ出すにはまだ1ヶ月かかるでしょう。


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


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

私は1ヶ月間チェックするのを待たずに、mm(すなわち分)で試して上書きすることを確認したので、すべてのパターンでうまくいくと仮定しています。


DailyRollingFileAppenderという別のオプションもあります。 それはあなたが探している機能を自動削除(7日間のログを維持)が欠けている

サンプル

log4j.appender.DRF=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DRF.File=example.log
log4j.appender.DRF.DatePattern='.'yyyy-MM-dd

RollingFileAppender (maxSizeRollBackups、バックアップファイルの番号 )とDailyRollingFileAppender (ロール毎日)の両方の機能を組み合わせたorg.apache.log4j.CompositeRollingAppenderを呼び出します。

しかし、それを試していない、標準1.2ブランチlog4jの機能ではないようです。


次の記事では、log4jでこれを行うことはできません: MaxBackupIndexをDailyRollingFileAppender -log4jで使用してください

私の知る限りでは、この機能はlog4j 2.0にすることになっていましたが、その努力は分かれました。 ログバックWebサイトによると、logbackはlog4jの意図された後継です。

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


DailyRollingFileAppenderクラスは、 DatePatternオプションを使用してローリングスケジュールを指定します。 このパターンは、 StdSimpleDateFormat規則に従う必要があります Ed。 v1.4.2 。 したがって、 Eオプション(曜日)を使用する必要がEます。 例えば:

<param name="DatePattern" value="'.'EEE"/>

http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/DailyRollingFileAppender.htmllog4j javadocの DailyRollingFileAppenderクラスの詳細を参照してください。 残念ながら、Java 1.4.2のドキュメントはオンラインではなくなりましたが、 hereコピーをダウンロードできます。


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

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

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

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

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


log2jに古いログを削除する機能が追加されました。 DefaultRolloStrategyタグと以下のスニペットを見てください。 同じ日に最大10個のアーカイブを作成し、プロパティタグの下に定義した$ {baseDir}ディレクトリを解析し、ログファイル名が "app - *。log.gz"に一致し、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>

私はこのMethodeを作成し、アプリケーションを閉じることによって呼び出します。

  public void deleteFiles(){

    File f = new File("log");
    File[] fileArray = f.listFiles();
    double timenow = System.currentTimeMillis();

    double olderTenDays = timenow - 864000000;// MS for ten days

    for (int i = 0; i < fileArray.length; i++) {

        if(fileArray[i].lastModified()< olderTenDays )
           fileArray[i].delete();
    }
 }

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

@ dk89からうまくキャッチできますが、うまくいけないことはありません。JDK 7では、JTextComponentにカスタムBreakIteratorを設定するための待機時間はまだありません。 BreakIteratorの生成がプライベートであるGlyphViewではなく そして、文字列charをcharで挿入すると、まだ動作しません。同じスタイル(AttributeSet)の連続した文字列が一緒に折りたたまれているとします。

私は、別の場所でアドバイスされているように、カスタムEditorKitをやろうとして2日間過ごしましたが、テキストとしてJDK 1.7.0_4以上でうまく動作しません。

私は、 JTextPanesに格納されている単語の折り返しテキストを、JListのセルhttp://www.experts-exchange.com/Programming/Languages/Java/Q_20393892.html セルにある方法で試してみました

しかし、JTextPaneが文中の最長の単語よりも小さい場合、breakViewはもはや呼び出されないことが分かりました。 したがって、1つの(長い)単語しかないときは、まったく動作しません。 これは私たちの場合です。ユーザが用意した識別子のような文字列を、スペースのない小さな文字で表示しています。

私は最終的に、バグレポートの提案から導かれた簡単な解決策を見つけました。実際には、文字列charをcharで挿入します。 したがって、私たちは文字を持っているのと同じくらい多くのセグメントを持っており、文字列は文字の境界で囲まれています。 次の「バグ修正」まで?

コードスニペット:

private JTextPane tp;
private SimpleAttributeSet sas = new SimpleAttributeSet();

tp= new JTextPane();
sas.addAttribute( "A", "C" ); // Arbitrary attribute names and value, not used actually

    // Set the global attributes (italics, etc.)
    tp.setParagraphAttributes(styleParagraphAttributes, true);

    Document doc = tp.getDocument();
    try
    {
        doc.remove(0, doc.getLength()); // Clear
        for (int i = 0; i < textToDisplay.length(); i++)
        {
            doc.insertString(doc.getLength(), textToDisplay.substring(i, i+1),
                    // Change attribute every other char
                    i % 2 == 0 ? null : sas);
        }
    }
    catch (BadLocationException ble)
    {
        log.warn("Cannot happen...", ble);
    }

バグに記載されているように、彼らは古い振る舞いに戻すための簡単な方法(おそらくいくつかのプロパティ、または注射可能なもの)を提供していたはずです。







java logging log4j