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