【发布时间】:2019-05-09 09:12:57
【问题描述】:
我有一个学校作业,我需要编写一个 python 脚本,该脚本从 systemd 的日志中返回一个 systemd 单元日志消息的列表。此外,它应该是最近的消息(过去 24 小时和 30 分钟)。例如,我想获取 sshd.service 的日志消息。 感谢您提供任何帮助我入门的提示。
【问题讨论】:
标签: python logging system monitoring
我有一个学校作业,我需要编写一个 python 脚本,该脚本从 systemd 的日志中返回一个 systemd 单元日志消息的列表。此外,它应该是最近的消息(过去 24 小时和 30 分钟)。例如,我想获取 sshd.service 的日志消息。 感谢您提供任何帮助我入门的提示。
【问题讨论】:
标签: python logging system monitoring
python-systemdsystemd 有官方的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'],
)
)
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)
但是,您负责将输出分成几行并解析出每个条目的相关信息,这很快就会比使用绑定更麻烦。
【讨论】:
您可以按照以下步骤操作:
尝试手动查看日志命令,搜索“systemd 日志”会导致您看到类似的内容:https://www.linode.com/docs/quick-answers/linux/how-to-use-journalctl/
想想如何从 python 运行所需的命令。搜索“从 python 调用外部命令”将引导您到 https://docs.python.org/3/library/subprocess.html
然后看看如何解析输出,将其转换为字符串,然后可能搜索关键字、正则表达式。等等。
【讨论】: