首页 > 解决方案 > 用于从 systemd 日志返回 systemd 单元日志消息列表的 Python 脚本

问题描述

我有一个学校作业,我需要编写一个 python 脚本,从 systemd 的日志中返回一个 systemd 单元日志消息列表。此外,它应该是最近的消息(过去 24 小时和 30 分钟)。例如,我想获取 sshd.service 的日志消息。感谢任何提示让我开始。

标签: pythonloggingsystemmonitoring

解决方案


python-systemd

systemd有官方的python 绑定,通常可以通过你的包管理器安装,例如

$ dnf install python3-systemd

对于 Fedora,或

$ apt install python3-systemd

适用于 Debian 及其衍生产品。如果在 virtualenv 中,您可以直接从 Git repo 安装pip

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

python-systemd具有清晰简洁的 API;这是一个示例脚本,用于获取过去 24 小时内记录的日志条目sshd.service,模仿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)

但是,您负责将输出分成几行并解析出每个条目的相关信息,这很快就会比使用绑定更麻烦。


推荐阅读