use*_*084 3 linux ubuntu python systemd systemd-journald
我需要从我的 systemd 日志文件中收集一些统计信息,例如有多少用户将某个查询字符串参数传递给我的服务。我知道我可以在 journalctl 中查看这些信息,但我不知道如何在 Go(或 Python)中这样做,以便我可以聚合数据。我一直在为此寻找一个库,但似乎找不到任何东西,而且我无法弄清楚日志文件的实际存储位置。
您可以使用 Journal API 以编程方式访问 systemd 日志。
或者,您可能需要考虑在您的主机上运行 systemd-journal-gatewayd 服务,该服务通过 HTTP 服务器导出日志数据,在这种情况下,您可以使用其他语言的 HTTP 客户端实现直接查询日志。
官方 Journal API 作为 systemd 本身的一部分提供,用于实现 journalctl。这是一个 C API。
此 API 访问 systemd-journald 下/var/log/journal
或/run/log/journal
直接写入的文件,因此您需要适当的权限才能从这些位置读取,这通常意味着您需要以 root 身份运行代码。
此 API 还要求您链接到 systemd 库并在运行时提供这些库。您需要libsystemd-dev
在 Ubuntu 18.04 系统上安装该软件包,以便能够对其进行编译和链接。
sudo apt-get install libsystemd-dev
Run Code Online (Sandbox Code Playgroud)
您可以查看sd-journal(3)的手册页以了解此 API 的一般概述。有关查询日志的更具体情况,请参阅sd_journal_next(3)(其中包含一个带有完整简单程序的不错示例),还有sd_journal_add_match(3)以限制您获得的匹配项(有效实施日志查询。)您将还需要sd_journal_get_data(3)、sd_journal_open(3)等,但希望这些指针可以让您开始直接访问日志。)
官方 systemd 项目中有systemd 的Python 绑定,其中包括 Journal API 的绑定。
这些模块也可作为 Ubuntu 18.04 软件包使用,您可以使用以下软件包进行安装:
sudo apt-get install python3-systemd
Run Code Online (Sandbox Code Playgroud)
...对于 Python 3(推荐),或者如果您仍然需要使用 Python 2,您可以使用:
sudo apt-get install python-systemd
Run Code Online (Sandbox Code Playgroud)
请参阅代码 docstrings 上systemd.journal
模块Reader
类的文档。本课程为您提供对期刊的阅读访问权限,这可能是您感兴趣的内容。
github.com/coreos/go-systemd模块中有 systemd 库的 Go 绑定。
查看sdjournal
子模块,特别是JournalReader
类型,用于从日志中读取,包括用于过滤的匹配项。您可以从源代码中找到有关它的更多信息
使用日志 API 直接访问日志文件的替代方法是运行通过 HTTP 服务器导出日志文件的服务。Systemd通过systemd-journal-gatewayd提供这样的服务。
该程序作为 systemd-journal-remote 软件包的一部分在 Ubuntu 18.04 上可用,因此您可以使用以下方法安装和启用它:
sudo apt-get install systemd-journal-remote
sudo systemctl enable --now systemd-journal-gatewayd
Run Code Online (Sandbox Code Playgroud)
这将在端口 19531 上导出 HTTP 服务器,您可以使用它来浏览和查询日志。
在systemd-journal-gatewayd.service(8)的手册页上查看更多详细信息,其中包括一些如何使用 curl 访问它的示例。您可以使用它自己的原生Journal Export Format将数据导出为 JSON 或类似 syslog 的纯文本。
如果您使用 systemd-journal-gatewayd 路由,请确保您了解通过 HTTP 服务器导出日志数据的安全隐患。至少,考虑只在本地主机上公开端口。