行が作成された時点に基づいてファイルを切り捨てる

行が作成された時点に基づいてファイルを切り捨てる

常に実行されるプロセスがあり、ログファイルは最大5 GBまで可能であり、時には時間間隔に基づいてこのログの一部を取得する必要があります(通常はddを使用)。時間間隔に基づいてログフラグメントを取得するコマンドはLinuxにありますか?

PS:このログのほとんどの行にはタイムスタンプはありません。

答え1

Wieseが提案したようにこれを実行できるコマンドがない場合は、ファイルの外部インデックスを作成してみてはいかがでしょうか。

単にアイデア:永遠に実行され(または以下の説明をほとんど見ることができます)、インデックスを生成するための時間間隔を提供するスクリプトを書くことができます。

PIDofThisInstance=$$
# ... you code for the header, checks... 
while true  ; do
  # This is the core of your cycle
    sync   # Maybe
    CurrentSize=`ls -s $MyFile  | awk '{print $1} ' `
    CurrentTime=`date +"%Y%m%d%H%M%S"`
    echo $CurrentTime $CurrentSize >> $Log_Of_My_Log_File
    sleep $TimeToSleep
  # if (exit-condition)
  # then
  #    break           #Exit from the infinite loop.
  # fi
done 

その後、開始/終了日/時間を提供する別のスクリプトを実行し、開始/終了ディメンションに応答できます。この数字からファイルを切り取ることができます。

あなたは非常に大きなファイルについて話しています。だから私はあなたにこれをお勧めしません行番号可能head MyFile.log -n xxx | tail -n yyy。とても長いでしょう。寸法処理が改善されました。

メモ:

  • これがフォーマットされた出力を持つログインの場合(わからなくても)、開発会社/プログラマーが提供する一種の分析ツールがある可能性が常にあります。数年後にも現れることがあります。 IMHO形式に触れることなく別々のファイルを作成することをお勧めします。
  • ログを生成したプログラムのPIDを知っている場合は、現在のPID(手動で終了する必要がある場合)、ファイル名(ログオブジェクト)などのスクリプトパラメータを作成してください。
  • ログを生成したプログラムのPIDが存在しない、ファイルが存在しない、実際のサイズが以前のサイズより小さい場合(ファイルを移動またはログを再起動する場合)、ループが永久に持続または終了する可能性がありますあります。インデックスを再起動する必要があります)。
  • $LastSize をメモリーに保持することで、不要なときに「ログ・ログ」に行を印刷しないか、長期間にわたってアクティビティーがない場合に停止するかどうかを決定できます (または時間間隔を動的に変更...)。

関連情報