有一个错误总是相同的,而且我将其记录在系统日志中,但是我不太清楚该错误是由什么引起的,因此我希望在错误发生时立即收到警报。我最好使用类似脚本的东西来监控系统日志中是否有包含该特定消息的任何行,如果检测到该消息,它会立即向我发出警报notify-send
,然后将其记录到文件中。我正在运行带有 GNOME 3.20 的 Ubuntu GNOME 16.04。我如何通过脚本实现这一点?或者是否有一些软件可以让我做到这一点?
答案1
下面是一个 Python 脚本:
每 5 秒检查一次文件是否有更改,如果更改,则检查字符串。如果找到字符串:
- 打印找到该行的位置以及当前时间
- [选修的]通知使用
notify-send
- [选修的]播放默认警报声音
用法:
python3 LogMonitor.py [log file] [string to watch]
可选参数,放在上述参数之后
beep
和/或notify
——这将导致脚本notify-send
除了打印消息外,还发出蜂鸣声和/或通知(使用)
因此,如果我想监视/var/log/auth.log
SSH 并发出哔声和通知我,我将:
python3 LogMonitor.py /var/log/auth.log SSH beep notify
原始下载(右键点击→保存链接为):GitHub 要点
#!/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)