如何监控系统日志并在出现某个条目时发出警报?

如何监控系统日志并在出现某个条目时发出警报?

有一个错误总是相同的,而且我将其记录在系统日志中,但是我不太清楚该错误是由什么引起的,因此我希望在错误发生时立即收到警报。我最好使用类似脚本的东西来监控系统日志中是否有包含该特定消息的任何行,如果检测到该消息,它会立即向我发出警报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.logSSH 并发出哔声通知我,我将:

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)

相关内容