web-dev-qa-db-ja.com

syslogを監視し、特定のエントリがあるときにアラートを受け取る方法

常に同じ特定のエラーがあり、syslogにアクセスしていますが、エラーの原因がよく分からないので、発生するたびにすぐにアラートを受け取りたいです。特定のメッセージを含む行のsyslogを監視し、それが検出された場合はすぐにnotify-sendそして、それをファイルに記録します。 Ubuntu GNOME 16.04とGNOME 3.20を実行しています。スクリプトでこれを達成するにはどうすればよいですか?または、これを可能にするソフトウェアがありますか?

1
user364819

Pythonのスクリプト:

5秒ごとにファイルの変更をチェックします。変更された場合、文字列をチェックします。文字列が見つかった場合:

  • 現在の時刻と一緒に見つかった行が印刷されます
  • [オプション]notify-sendを使用して通知します
  • [オプション]デフォルトの警告音を再生します

使用法:

python3 LogMonitor.py [log file] [string to watch]

上記の後に配置されるオプションの引数

  • beepおよび/またはnotify-これにより、メッセージの出力に加えて、スクリプトがビープ音および/または通知(notify-sendを使用)します。

したがって、SSHの/var/log/auth.logを見て、ビープ音を鳴らし、通知したい場合は、次のようにします。

python3 LogMonitor.py /var/log/auth.log SSH beep notify

未加工のダウンロード(右クリック名前を付けてリンクを保存): GitHub Gist

#!/usr/bin/env python

import os
import sys
import subprocess
import collections
import time
import mmap

try:

    LOG_FILE = os.path.abspath(sys.argv[1])
    WATCH_FOR = sys.argv[2]

except:

    sys.stderr.write(
        'Usage: %s [log file] [string to watch for]' % sys.argv[0])
    sys.exit(1)

def action():

    if 'beep' in sys.argv:

        subprocess.Popen(['paplay', '/usr/share/sounds/ubuntu/notifications/Mallet.ogg'])

    if 'notify' in sys.argv:

        subprocess.Popen(['notify-send', 'LogMonitor', 'Found!'])

    print(time.strftime('%Y-%m-%d %I:%M:%S %p'), 'Found! \n', i)

# basic Python implementation of Unix tail

def tail(file, n):

    with open(file, "r") as f:

        f.seek (0, 2)           # Seek @ EOF
        fsize = f.tell()        # Get Size
        f.seek (max (fsize-1024, 0), 0) # Set pos @ last n chars
        lines = f.readlines()       # Read to end

    lines = lines[-n:]    # Get last 10 lines

    return lines


print(
    'Watching of ' + LOG_FILE + ' for ' + WATCH_FOR +
    ' started at ' + time.strftime('%Y-%m-%d %I:%M:%S %p'))

mtime_last = 0

while True:

    mtime_cur = os.path.getmtime(LOG_FILE)

    if mtime_cur != mtime_last:

        for i in tail(LOG_FILE, 5):

            if WATCH_FOR.lower() in i.lower():

                action()

    mtime_last = mtime_cur

    time.sleep(5)
3