web-dev-qa-db-ja.com

シェルスクリプトを使用したログ監視

ログファイルのエラーを監視し、管理者にメールを送信したいと思います。

ログファイルには以下のようなデータが含まれています

11 Aug 02:30 Service1 restarted
11 Aug 05:35 Service1 restarted
11 Aug 08:43 Service2 restarted
11 Aug 11:20 Service1 restarted
11 Aug 14:53 Service2 restarted

5分ごとに実行され、最後に発生したサービスの再起動を確認してメールを送信するスクリプトを作成したいと思います。

たとえば、スクリプトが02:35に実行された場合、Service1が再起動したことがわかり、Service1 restarted at 02:30のような電子メールが送信されます。スクリプトが5:45に実行されると、Service1が05:35にのみ再起動したことを示すメールが送信されます(02:35の再起動は含めないでください)。

この要件を達成する方法はありますか?私は基本的にLinuxとシェルスクリプトが初めてです

5
YRVK

5分のcrontabを作成することから始めます。

*/5 * * * * myscript.sh

Myscript.shを実行します($HOME dir)

 #!/bin/bash
 tail -1 /path/to/file.log > /some/dir/after
 if cmp -s /some/dir/after /some/dire/before
 then
     cat /some/dir/after | mail -s "restart" [email protected]
     cp /some/dir/after /some/dir/before
 fi

正しい値を使用します(もちろん)。

これは、5分以内に2回の再起動がないことを意味することに注意してください。

4
Archemar

02:35にファイルの最後の行が02:30の再起動になると想定しているため、必要なのは次のようなcronエントリだけです。

*/5 * * * * tail -1 /path/to/file.log | mailx -s "Last restart" [email protected]

このアプローチの欠点は、管理者が同じメールを02:35、02:40、02:45などに受信することです。

3
glenn jackman

これを試して:

crontab

*/5 * * * * /path/to/checklog.bash

スクリプト

#!/bin/bash

service=$(tail -1 /path/to/logfile | awk '{print $4}')
logdate=$(tail -1 /path/to/logfile | awk '{print $1,$2,$3}')

if  test 'find "/path/to/logfile" -mmin -5'
then
    echo "$service was restarted on $logdate" | mail -s "Restart notification" [email protected]
fi
2
tachomi

@ glenn-jackmanが提供する回答 の改善点の1つは、mailxの-Eオプションを使用することです。 mailxのmanページから:

-E

本文が空のメッセージは送信しないでください。これは、cron(8)スクリプトからのエラーをパイプするのに役立ちます。

0
hlongmore

これに対処するためのより信頼性の高い方法は、念頭に置いている正確なシナリオ用に構築されたツールを使用することです(これは、ログを監視し、新しく検出されたパターンでメールを送信することです)。

このツールをダウンロード

解凍して実行すると、模倣できる実際の例が多数表示されます。注目する1つの例はMODEL13です。これは、1つまたは複数の異なるログでパターンが検出されたときに、特定の電子メールアドレスに電子メール通知を送信するタスクに対処します。

./logrobot localhost /var/tmp/logXray autonda /var/log 60m '.*error.*_P_.*fatal.*' '.'  1 1 errchk -ndshow [email protected]

上記のコマンドで、以下のパラメーターは、必要に応じて変更する必要があります。

  • '。* error。* _ P _。* fatal。*'-ここでは、/ var/logディレクトリのすべてのログで2つのパターンが検索されています

  • / var/log-これは、ログを監視するディレクトリです。特定のログファイルを監視する場合は、これをログファイルへの絶対パスに置き換えます。

  • 1-ログに1つのエントリが見つかった場合、警告アラートを送信します
  • 1-ログに1つのエントリが見つかった場合、クリティカルアラートを送信します
    • 警告とクリティカルが同じである場合、監視されたパターンがログで見つかったときに、チェックはクリティカルとしてアラートします。
  • errchk-これは、この特定のログチェックのタグです。これにふさわしい名前を付けてください...監視されているログのタイプと一致する名前...つまりtomcatLogCheck
  • そしてもちろんemail =。これを適切なメールアドレスに変更します。

監視対象のログに追加された新しい行のみがスキャンされることを保証する必要なロジックが含まれているため、これはより良いオプションです。また、はるかに効率的です。そしてそれはまた携帯可能であるべきです。

もちろん、Postfixがホストにインストールされていることを確認して、電子メールを送信できるようにします。ここで何かを忘れているかもしれませんが、それがツールの動作の要点です。

0