我需要从 systemd 日志文件中收集一些统计信息,例如有多少用户将某个查询字符串参数传递给我的服务。我知道我可以在journalctl中查看这些信息,但我不知道如何在Go(或Python)中查看这些信息,以便我可以聚合数据。我一直在为此寻找一个库,但似乎找不到任何东西,而且我无法弄清楚日志文件的实际存储位置。
答案1
您可以使用 Journal API 以编程方式访问 systemd 日志。
或者,您可能需要考虑在主机上运行 systemd-journal-gatewayd 服务,该服务通过 HTTP 服务器导出日志数据,在这种情况下,您可以使用其他语言的 HTTP 客户端实现来直接查询日志。
期刊API
官方 Journal API 作为 systemd 本身的一部分提供,用于实现 journalctl。这是一个 C API。
/var/log/journal
此 API 访问由 systemd-journald 下或直接写入的文件/run/log/journal
,因此您需要适当的权限才能从这些位置读取,这通常意味着您需要以 root 身份运行代码。
此 API 还要求您链接到 systemd 库并让这些库在运行时可用。您需要libsystemd-dev
在 Ubuntu 18.04 系统上安装该软件包,以便能够对其进行编译和链接。
sudo apt-get install libsystemd-dev
您可以查找手册页SD-期刊(3)有关此 API 的一般概述。更具体的查询期刊的案例,参见sd_journal_next(3)(其中包括一个带有完整简单程序的很好的示例),还sd_journal_add_match(3)限制您获得的匹配项(有效地实现日记查询。)您还需要sd_journal_get_data(3),sd_journal_open(3)等等,但希望这些指示可以帮助您开始直接访问日志。)
Python 绑定
有Python 绑定来自官方 systemd 项目的 systemd,其中包括 Journal API 的绑定。
这些模块也可以作为 Ubuntu 18.04 软件包提供,您可以使用以下命令进行安装:
sudo apt-get install python3-systemd
...对于Python 3(推荐),或者如果您仍然需要使用Python 2,您可以使用:
sudo apt-get install python-systemd
systemd.journal
请参阅模块Reader
类的文档在代码文档字符串上。本课程为您提供对期刊的阅读权限,这可能是您感兴趣的内容。
Go 绑定
有针对 systemd 库的 Go 绑定github.com/coreos/go-systemd模块。
查看sdjournal
子模块,特别是JournalReader
类型,用于从日志中读取,包括用于过滤的匹配项。您可以找到更多相关信息从源代码来看
期刊网关
使用 Journal 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
这将在端口 19531 上导出 HTTP 服务器,您可以使用该服务器浏览和查询日志。
请参阅手册页上的更多详细信息systemd-journal-gatewayd.service(8),其中包括一些如何使用curl 访问它的示例。您可以让它使用自己的本机导出数据期刊导出格式,作为 JSON 或类似 syslog 的纯文本。
如果您选择 systemd-journal-gatewayd 路线,请确保您了解通过 HTTP 服务器导出日志数据的安全隐患。至少,考虑仅在本地主机上公开端口。
答案2
我认为journalctl
抓住了 的一个子集/var/log/syslog
,这个子集就是它所知道的东西。这只是观察所得。如果您journalctl
不带任何参数运行,您将看到所有日志。按退出q
然后运行tail /var/log/syslog
。您会注意到相同的输出,而且文件中的信息syslog
将包含比journalctl
输出更多的信息。
因此,根据下面的评论,您可以确保安装了系统日志,然后只解析/var/log/syslog
您需要的内容。您还可以让您的服务(不清楚那是什么)写入它自己的 log in /var/log/
。