log4jファイルのソートとバックアップ

log4jファイルのソートとバックアップ

質問が長すぎてすみません。これは説明が難しいです。私は英語に堪能であってもそうではありません。 ;)
この質問にはJava、log4jライブラリ、Linuxがあるので、どこに投稿するのかわかりません。

想像する:

log4jを使用して生成された複数のログファイルがありますRollingFileAppender。名前ファイル。ログそしてファイル.ログ.1到着ファイル。ログ。10
すべてのファイルは1日に数回上書きされます。つまり、イベントを受信すると上書きされるため、何が起こったのかを確認できるログがほとんどないはずです。

目的:

私の意図は、特定の条件下で定期的にこれらのファイルをバックアップすることです。

  • まず、データを見逃さないでください。
  • 情報を繰り返さないでください。 (情報を整理すれば解決可能)
  • データを並べ替える必要があります。 (質問!!)

指示:

  • 各個々のファイルはソートされますが、データを書き込む2つのサーバーインスタンスがあるため、ファイル全体がソートされるわけではありません。
    私の言葉は、あるインスタンスが* .log.1に書き込むことができ、別のインスタンスが* .log.2に同時に書き込むことができるということです。だから私はそれらをすべてマージしてソートすることは期待できません。
  • ファイルシステムの空き容量を増やすことはできません。

ログレジスタのレイアウト:

各行は次のようになります。

2014-11-28 14:33:10,015 メイン ca.cpy.net.txc.batch.SendEER INFO - 情報

努力する:

  1. からアフェンダータイプに移動されましたRollingFileAppenderDailyRollingFileAppender残念ながら、Apacheドキュメントには次のように記載されています。

    「DailyRollingFileAppenderで同期の問題とデータ損失が発生することが観察されました。」

    だから私はそれを使用することはできません。

  2. Apache log4j extrasライブラリを使用していますが、これを行うことはできません。それは私次第ではありません。
  3. すべてを自分でやってください。これには以下が含まれます。

    • すべてのファイルをマージ
    • 並べ替え
    • 以前のバックアップに保存されたすべてのデータを破棄します。
    • 圧縮


    問題はソート段階にあります。私が試したことは次のとおりです。

    for ((i=10; i >= 1; i--)); do 
        cat file.log.$i >> $FILE_OUT;  ## put all files in one (as much sorted as possible)
    done;  
    cat file.log >> $FILE_OUT;  ## append last 
    sort -s -t ' ' -k 1.1,1.4n -k 1.6,1.7n -k 1.9,1.10n -k 2.1,2.2n -k 2.4,2.5n -k 2.7,2.8n -k 2.10,2.12n -3k $FILE_OUT -o $FILE_SORTED # Sort by date/time
    


    さて、ログにレジスタごとに1行しか追加されていない場合(つまり、行末文字\ nがない場合)は機能します。たとえば、上記のsortコマンドは次のレジスタを削除します。

    2014-11-28 14:33:10,015 main ca.cpy.net.txc.batch.SendEER INFO  - 
     ***** RESULTATS ENVIAMENT EXPEDIENT ***** 
        Total documents a tractar en DB: 86
     ***************************************** 
    

    最初の行だけがソートされ、残りの3行は出力ファイルの先頭に配置されます。

複数行を含むすべてのレジスタを削除せずにマージされたファイルを並べ替える方法はありますか?他のアイデアも非常に歓迎されます。

ベストアンサー1

1つの方法は次のとおりです。

ログファイルをNUL- で区切って作成します。つまり、各レコードはNUL\0)文字で終わるようにします。その後、NULさまざまなツール(sed、、sortなどxargsfindで区切られたテキストのサポートを利用できます。 1つの方法は次のとおりです。

perl -pe 's/^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})/\0$1/' file.log.2 > file.log.2.NULL
  • 各タイムスタンプの前に1を追加します。\0(これは反対の方法です。レコードがで始まりますNULが、実際には...)

これにより、次のことができます。

sort -szt ' ' -k1,2 file.log{.{10..1},}.NULL -o $FILE_SORTED
  • -s安定したソートのために(バインディング項目が表示される順序でソートされるように)
  • -zNUL区切りテキストサポートを有効にする
  • コメントで指摘したように、フォームのタイムスタンプをYYYY-MM-DD HH:MM:SS,UUUアルファベット順に並べることができるので、キーを変更しました。数字で並べる必要はありません。

あるいは、これらの一時ファイルをすべて完全に避けることができます。

perl -pe 's/^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})/\0$1/' file.log{.{10..1},} | \    
 sort -szt ' ' -k1,2 -o $FILE_SORTED

おすすめ記事