返回systemd单位列表的Python脚本记录来自systemd日志的消息

时间:2019-05-09 09:12:57

标签: python logging system monitoring

我有一个学校作业,需要编写一个python脚本,该脚本返回systemd日志中的systemd单位日志消息列表。同样,它应该是最近的消息(过去24小时30分钟)。例如,我想获取sshd.service的日志消息。 感谢有任何提示可以帮助我入门。

2 个答案:

答案 0 :(得分:0)

您可以按照以下步骤操作:

答案 1 :(得分:0)

python-systemd

systemd具有官方的python bindings,通常可以通过您的软件包管理器进行安装,例如

$ dnf install python3-systemd

对于Fedora,或

$ apt install python3-systemd

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

$ 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)

但是,您有责任将输出分成几行并解析每个条目的相关信息,这比使用绑定要麻烦得多。