web-dev-qa-db-ja.com

「過去1時間にログファイルから書き込まれた行」をテールすることは可能ですか?

ログファイルのパターンを探してgrepを実行しようとしていますが、ログファイルの最後の1時間が必要です。 tail -n XXは機能しません。これが可能かどうか誰かが知っていますか?ある種の「ログファイルから書き込まれた過去1時間の行」を末尾に追加)

コマンドや手順がある場合は、感謝します。

どうもありがとう

7
RRR CCC

ログの構造が次のとおりだとします。

219.369.42.449 - - [05/Mar/2020:11:05:17 +0200] "log line"
219.369.42.449 - - [05/Mar/2020:11:06:37 +0200] "log line"
219.369.42.449 - - [05/Mar/2020:12:01:14 +0200] "log line"
219.369.42.449 - - [05/Mar/2020:12:07:23 +0200] "log line"

次のようにsedを使用すると、ファイルの最初の05/Mar/2020:11から最後の$までのすべての行を取得できます。

sed -n '/05\/Mar\/2020:11/,$p' "/path/to/file.log"
  • オプション-nsedの通常の出力を抑制しますが、フラグpはファイルの一致した部分を出力します。

  • 05/Mar/2020:11に対応するレコードが提示されていない場合、sedは出力を提供しません。

コマンドdateおよびevalを使用して、上記を自動化できます。

COMMAND="sed -n '/$(LANG=C date --date='1 hour ago' "+%d\/%b\/%Y:%H")/,\$p'"
eval $COMMAND \"/path/to/file.log\"
  • この場合、二重引用符と変数内でsedを使用すると、望ましい出力が得られません。
  • したがって、最初にコマンドを文字列として作成し、evalを使用して実際のコマンドに変換します。
  • LANG=CLANG=en_us_88591)は、希望する日付形式を取得するために立っています。たとえば、私の場合、この環境変数のデフォルト値はbg_BG.UTF-8です。

上記の2行に基づいてスクリプトを作成できます-そのようなスクリプトの例:

12
pa4080

過去1時間の変更を追跡するコマンドやオプションはありません。ログのタイムスタンプをgrepするか、tail -f実行していて、何かをチェックする必要があるときは、スクロールして戻ります。これには、61分前に発生したイベントをキャッチできるという利点もあります。

4
Fast Haver

5分ごとにコマンドを実行する場合は、ログファイルのコピーも作成します。次に、作成した12番目の最後のコピーと比較して、現在の変更を取得できます。

3
vikta11450

私が通常取るアプローチは次のとおりです。

tail -f {log}

これには、{log}への書き込み時にテールショーメッセージが表示され、コマンドを停止したときにのみ終了します。したがって、表示されるのはリアルタイムであり、論理的には常に現在の1時間以内です。端末セッションのバッファサイズは、時間を遡ってスクロールできるサイズになります。

2
Rinzwind

@ pa4080がちょうど1時間前に取得していた日付コマンドを使用します。これをawkスクリプトに渡して、正しい年、月、日、および一致する時間とそれ以上の分またはそれ以上の時間を含む最初の行を見つけます。最初の行からファイルの終わりまでの出力。

私のawkはそれほど強くないか、あなたのために書こう。うまくいけば、他の誰かがあなたのためのawkマスターになるでしょう。

0
Sinc

皆様、本当にありがとうございました。監視ツールであるZabbixを使用して問題を処理できました。

@ pa4080そのスクリプトは次のオプションです。どうも

この質問を締めくくることができます。

0
RRR CCC