Скрипт Python для возврата списка сообщений журнала системных модулей из журнала systemd - PullRequest
2 голосов
/ 09 мая 2019

У меня есть школьное задание, где мне нужно написать скрипт на python, который возвращает список сообщений журнала системных модулей из журнала systemd. Также это должны быть последние сообщения (последние 24 часа и 30 минут). Например, я хотел бы получить сообщения журнала для sshd.service. Благодарен за любые советы, чтобы начать меня.

Ответы [ 2 ]

0 голосов
/ 11 мая 2019

python-systemd

systemd имеет официальные привязки Python , которые обычно можно установить через менеджер пакетов, например,

$ dnf install python3-systemd

для Fedora или

$ apt install python3-systemd

для Debian и производных. Если в virtualenv, вы можете установить непосредственно из Git-репо с pip:

$ pip install git+https://github.com/systemd/python-systemd

python-systemd имеет понятный и понятный API; Вот пример сценария, который выбирает записи журнала, зарегистрированные для sshd.service за последние 24 часа, имитируя journalctl формат по умолчанию:

import datetime
import systemd.journal


if __name__ == '__main__':
    date_last_24h = datetime.datetime.now() - datetime.timedelta(hours=24)
    reader = systemd.journal.Reader()
    reader.seek_realtime(date_last_24h.timestamp())
    reader.log_level(systemd.journal.LOG_INFO)
    reader.add_match(_SYSTEMD_UNIT='sshd.service')
    for entry in reader:
        print(
            '{} {} {}: {}'.format(
                entry['__REALTIME_TIMESTAMP'].strftime('%B %d %H:%M:%S'),
                entry['_HOSTNAME'],
                entry['_SELINUX_CONTEXT'],
                entry['MESSAGE'],
            )
    )

Запрос журнала только с помощью stdlib (subprocess)

Если вам не разрешено устанавливать python-systemd, прибегните к вызову journalctl с соответствующими аргументами запроса:

import subprocess
import shlex

if __name__ == '__main__':
    result = subprocess.run(shlex.split('journalctl -u systemd-udevd --since today'))
    raw_output = result.stdout
    print(raw_output)

Однако вы несете ответственность за разбиение вывода на строки и анализ соответствующей информации для каждой записи, что может быстро оказаться более громоздким, чем использование привязок.

0 голосов
/ 09 мая 2019

Вот несколько шагов, которые вы могли бы выполнить:

  • Попробуйте вручную просмотреть команду logs. Поиск «системных журналов» приведет вас к чему-то вроде: https://www.linode.com/docs/quick-answers/linux/how-to-use-journalctl/

  • Подумайте, как вы можете запустить нужную команду из python.Поиск 'call external command from python' приведет вас к https://docs.python.org/3/library/subprocess.html

  • Затем посмотрите, как вы можете проанализировать вывод, преобразовать его в строку, а затем, возможно, найти ключевые слова, регулярные выражения.и т. д.

...