web-dev-qa-db-ja.com

時間によってログファイルを追跡する方法

私のログファイル(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....

過去1時間のログを表示するためにこのファイルをテールし、テールを維持したいと思います。

つまり.

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....

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

7
user40129

ワンライナーで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
5
rAlen
onehourago=$(date --date='1 hours ago' +"%b%e %H:%M:%S") 
echo $onehourago | cat /var/log/auth.log - | sort | sed "1,/$onehourago/d"

Sed-commandなしの中間出力:

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で削除します。

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

1
user unknown