如何在journalctl之外分析journalctl日志?

如何在journalctl之外分析journalctl日志?

我需要从 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/

相关内容