時間の経過とともにログファイルを追跡する方法は?

時間の経過とともにログファイルを追跡する方法は?

私のログファイル(log.txt)が次のようになっているとしましょう。

2014-01-01 22:30:30 something happened....
2014-01-01 22:30:31 something happened....
2014-01-01 22:30:41 something happened....

このファイルを追跡して過去のログを表示し、追跡を続行したいと思います。

つまり

tail <some magic to specify last 1 hour> -f log.txt

その後、出力は次のようになります。

2014-01-01 21:30:41 something happened....
...
2014-01-01 22:30:30 something happened....
2014-01-01 22:30:31 something happened....
2014-01-01 22:30:41 something happened....

これを行うツールはありますか?

答え1

onelinerではgrepとtailの組み合わせを使用できます。

grep "2014-01-01 21:" log.txt; tail -f log.txt

その時間から始めて、すべての内容を印刷し続けます。

または、awkを使用して、特定の時間の開始からファイルの終わりまですべての内容を印刷し、その後も追跡を続けることができます。これにより、必要に応じて過去数時間を追跡できます。

awk '/2014-01-01 21:/' log.txt; tail -f log.txt

答え2

onehourago=$(date --date='1 hours ago' +"%b%e %H:%M:%S") 
echo $onehourago | cat /var/log/auth.log - | sort | sed "1,/$onehourago/d"

sed コマンドのない中間出力:

Aug  7 00:00:03 thinkpux CRON[25475]: pam_unix(cron:session): session closed for user stefan
Aug  7 00:17:01 thinkpux CRON[25504]: pam_unix(cron:session): session closed for user root
Aug  7 00:17:01 thinkpux CRON[25504]: pam_unix(cron:session): session opened for user root by (uid=0)
Aug 7 00:19:33
Aug  7 01:00:02 thinkpux CRON[25652]: pam_unix(cron:session): session opened for user stefan by (uid=0)
Aug  7 01:00:03 thinkpux CRON[25652]: pam_unix(cron:session): session closed for user stefan
Aug  7 01:17:01 thinkpux CRON[25885]: pam_unix(cron:session): session closed for user root
Aug  7 01:17:01 thinkpux CRON[25885]: pam_unix(cron:session): session opened for user root by (uid=0)

出力:

Aug  7 01:00:02 thinkpux CRON[25652]: pam_unix(cron:session): session opened for user stefan by (uid=0)
Aug  7 01:00:03 thinkpux CRON[25652]: pam_unix(cron:session): session closed for user stefan
Aug  7 01:17:01 thinkpux CRON[25885]: pam_unix(cron:session): session closed for user root
Aug  7 01:17:01 thinkpux CRON[25885]: pam_unix(cron:session): session opened for user root by (uid=0)

注:最初に、日付を「+b%e%H:%M:%S」として設定しました(%bと%eの間のスペースに注意してください。しかし、echoは2つのスペースを1つに圧縮します。sedで検索することは次のとおりです。2つのスペースがあり、式がないため、月の日付が2桁か1桁かを区別するのは複雑ですが、ソートは追加/欠落したスペースに関係なく、圧縮を防ぐためのbashスイッチがあります。できますが、日付形式が異なるため、影響を受けませんが、どういうわけかこのアプローチをテストする必要があり、学習者も同じトラップに陥ることがあります。

したがって、一般的なアイデアは、1時間前の日付/時刻を取得し、ログファイルのようにフォーマットし、ログファイルに純粋な日付を追加し、混合物をソートしてから、sedを使用して純粋な日付より前のエントリを削除することです。コンテンツ。

覚えて入力するのは面白くありませんが、スクリプトや関数に入れることができます。

答え3

tail -f次の組み合わせを使用できますperl

# Tail with timestamp
tail -f log.txt | perl -pe '$_ = localtime.": $_"'

これにより、端末に次の出力が提供されます。

タイムスタンプの末尾 #1 タイムスタンプ#2に後続

次のように、この標準出力をファイルに保存することもできます。

tail -f log.txt | perl -pe '$_ = localtime.": $_"' >> timestamped_log.txt

これが解決策を提供することを願っています。

答え4

  • greporの問題awkは、常にファイル全体を読み、各行を確認する必要があることです。
  • 問題tailは、どのくらいの行が必要かわからないということです。

だから試してみtacawkくださいtail -f-n0

tac file \
  | awk -F'[- :]' -v datefilter="$(date -d -1hour +%s)" 'mktime($1 OFS $2 OFS $3 OFS $4 OFS $5 OFS $6) < datefilter {exit} 1' \
  | tac
tail -f -n0

(2つのコマンドの間に新しい行があると、その行を失う可能性があります。)

関連情報