Как отслеживать системный журнал и получать уведомления, когда есть определенная запись?

Существует определенная ошибка, которая всегда одна и та же, и я попадаю в системный журнал, однако я не совсем уверен, чем вызвана ошибка, поэтому я хотел бы получать оповещения сразу же, когда она возникает. Предпочтительно, я хотел бы, чтобы что-то вроде скрипта отслеживало системный журнал для любых строк, содержащих это определенное сообщение, и, если оно было обнаружено, немедленно предупреждает меня через notify-send и затем регистрирует его в файле. Я использую Ubuntu GNOME 16.04 с GNOME 3.20. Как я могу добиться этого с помощью сценария? Или есть какое-то программное обеспечение, которое позволило бы мне сделать это?

1
задан 2 June 2016 в 11:38

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)
3
ответ дан 2 June 2016 в 11:38

Другие вопросы по тегам:

Похожие вопросы: