Systemd Journal 支持

oslo.log 的一项新功能是能够原生地与较新的 Linux 系统上的 systemd journal 服务 (journald) 集成。在使用原生 journald 支持时,除了日志消息本身之外,还会记录额外的元数据到每个日志消息中,稍后可以使用这些元数据对日志进行一些有趣的搜索。

启用

为了启用此支持,您必须安装 Python 的 systemd 绑定。在基于 Red Hat 的系统上,运行

yum install systemd-python

在基于 Ubuntu/Debian 的系统上,运行

apt install python-systemd

如果您的发行版没有原生软件包,或者您正在 virtualenv 中运行,则可以使用 pip 安装。

pip install systemd-python

注意

在 pypi 上还有许多非官方的 systemd python 模块,名称非常相似,容易混淆。请确保安装 systemd-python

安装软件包后,您必须在所有将使用它的服务中手动启用 journald 支持。将以下内容添加到所有服务的配置文件中

[DEFAULT]
use_journal = True

在所有相关配置文件中。

额外元数据

Journald 支持在日志消息本身之外添加结构化元数据的概念。这使得将 journald 的输出推送到其他日志记录系统(如 Elastic Search)变得更加容易,而无需使用正则表达式猜测相关数据。它还允许您使用 journalctl 按这些字段搜索日志。

如果记录消息时已知,我们将使用此功能添加我们自己的结构化信息。

CODE_FILE=, CODE_LINE=, CODE_FUNC=

生成此消息的代码位置(如果已知)。包含源文件名、行号和函数名。(这与 systemd 使用的相同)

THREAD_NAME=, PROCESS_NAME=

有关线程和进程的信息(如果已知)。(这与 systemd 使用的相同)

EXCEPTION_TEXT=, EXCEPTION_INFO=

有关异常的信息(如果已记录异常)。

LOGGER_NAME=

发出日志消息的 python logger 的名称。通常,这是发出日志消息的模块。

LOGGER_LEVEL=

python 日志记录级别名称,允许轻松查看所有“ERROR”消息,而无需记住它们如何转换为 syslog 优先级。

SYSLOG_IDENTIFIER=

为 syslog 兼容性标识的二进制名称。它将是发出日志消息的进程的基本名称(例如 nova-apineutron-l3-agent

PRIORITY=

syslog 优先级(基于 LOGGER_LEVEL),允许根据优先级过滤 syslog 样式的消息(例如 openstack.err 日志文件)。

REQUEST_ID=

大多数 OpenStack 服务会在每个 REST API 调用上生成一个唯一的 request-id,然后在处理该请求时将其传递给它的子服务。例如,这对于跟踪 nova 服务器从初始 HTTP POST 到最终 VM 创建的构建过程非常有用。

PROJECT_ID=, PROJECT_NAME=, USER_ID=, USER_NAME=

关于请求者的 keystone 已知用户和项目信息。为了便于搜索,都提供了 id 和名称。这可用于了解特定用户或项目何时在环境中报告问题。

可能会随着时间的推移添加额外的字段。字段不太可能被删除,但如果删除,将在删除之前的一个发布周期内弃用它们。

使用 Journalctl

由于 systemd 在 Linux 生态系统中相对较新,因此值得注意的是如何有效地使用 journal control。

如果您想跟踪所有 journal 日志,您将使用

journalctl -f

这将是您系统上的几乎所有内容,您可能会觉得不堪重负。您可以使用 SYSLOG_IDENTIFIER= 将其限制为较少的内容

journalctl -f SYSLOG_IDENTIFIER=nova-compute SYSLOG_IDENTIFIER=neutron-l3-agent

多次指定查询参数默认为 OR 操作,因此这将显示 nova-compute 或 neutron-l3-agent 日志。

您还可以按请求 id 查询,以查看 REST 调用流程的完整过程

journalctl REQUEST_ID=req-b1903300-77a8-401d-984c-8e7d17e4a15f

参考