python - 用于从 systemd 日志返回 systemd 单元日志消息列表的 Python 脚本
问题描述
我有一个学校作业,我需要编写一个 python 脚本,从 systemd 的日志中返回一个 systemd 单元日志消息列表。此外,它应该是最近的消息(过去 24 小时和 30 分钟)。例如,我想获取 sshd.service 的日志消息。感谢任何提示让我开始。
解决方案
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)
但是,您负责将输出分成几行并解析出每个条目的相关信息,这很快就会比使用绑定更麻烦。
推荐阅读
- python - 在有大小限制的子文件夹中压缩文件
- azure - Databricks Azure - 如何从笔记本运行 API 命令
- c++ - 如何在数据库中实现对象的多个版本
- google-sheets - 如何在 Google Sheet Query 中插入 UPPER 函数?
- c++ - 在 C++ 中,分支预测器是否预测隐式条件语句?
- swift - 我的数组中的索引路径超出范围,videoArray 中的致命错误 - Swift
- javascript - 过渡结束后如何更改组件的显示属性?
- javascript - 如何在标签中隐藏单词 country 同时保持 Country invalid 可见?
- spring-boot - 将标头传播到请求的所有服务
- python - python遍历组合框下拉