23.8. 使用 Rsyslog 的结构化日志记录
在生成大量日志数据的系统上,以结构化格式维护日志消息非常方便。利用结构化消息,搜索特定信息、生成统计数据以及应对消息结构中的更改和不一致变得更容易。rsyslog 使用 JSON (JavaScript 对象表示法)格式为日志消息提供结构。
比较以下非结构化日志消息:
Oct 25 10:20:37 localhost anacron[1395]: Jobs will be executed sequentially
凭借结构化功能:
{"timestamp":"2013-10-25T10:20:37", "host":"localhost", "program":"anacron", "pid":"1395", "msg":"Jobs will be executed sequentially"}
使用键值对搜索结构化数据比使用正则表达式搜索文本文件更快、更准确。通过该结构,您可以在各种应用生成的消息中搜索相同的条目。此外,JSON 文件可以存储在文档数据库中,如 MongoDB,后者提供额外的性能和分析功能。另一方面,结构化消息需要的磁盘空间要多于非结构化空间。
在 rsyslog 中,使用 imjournal
模块从 Journal 中拉取包含元数据的日志消息。使用 mmjsonparse
模块时,您可以解析从 Journal 导入 的数据以及从其他来源导入的数据,并进一步处理它们,例如数据库输出。若要成功解析,mmjson
稀疏要求输入消息的结构由 Lumberjack 项目定义。
Lumberjack 项目旨在以向后兼容的方式将结构化日志记录添加到 rsyslog 中。若要识别结构化消息,Lumberjack 指定 @cee: 字符串,该字符串以前缀于实际 JSON 结构。此外,Lumberjack 定义了应当用于 JSON 字符串中实体的标准字段名称列表。有关 Lumberjack 的详情请参考 “在线文档”一节。
以下是 lumberjack 格式的消息示例:
@cee: {"pid":17055, "uid":1000, "gid":1000, "appname":"logger", "msg":"Message text."}
要在 Rsyslog 中构建此结构,需要使用一个模板,请参阅 第 23.8.2 节 “过滤结构化消息”。应用程序和服务器可以使用 libumberlog
库生成符合 lumberjack 的格式的消息。有关 libumberlog
的详情请参考 “在线文档”一节。
23.8.1. 从日志导入数据
imjournal
模块是 Rsyslog的输入模块,用于原生读取日志文件(请参阅 第 23.7 节 “Rsyslog 和日志的交互”)。然后,日志消息作为其他 rsyslog 消息以文本格式记录。但是,通过进一步处理,可以将 日志 提供的元数据转换为结构化消息。
要将数据从 Journal 导入到 Rsyslog,请在 /etc/rsyslog.conf
中使用以下配置:
module(load=”imjournal” PersistStateInterval=”number_of_messages” StateFile=”path” ratelimit.interval=”seconds” ratelimit.burst=”burst_number” IgnorePreviousMessages=”off/on”)
- 使用 number_of_messages 时,您可以指定必须保存日志数据的频率。每次到达指定数量的消息时都会发生此情况。
- 使用到状态文件的路径替换 path。此文件跟踪最近处理的日志条目。
- 使用秒时,您可以设置速率限值间隔的长度。在此间隔内处理的消息数量不能超过 burst_number 中指定的值。默认设置是每 600 秒 20,000 条消息。rsyslog 会丢弃在指定时间范围内最大突发后的消息。
-
通过
IgnorePreviousMessages
,您可以忽略当前位于日志中的消息,仅导入新消息,可在未指定状态文件时使用。默认设置为off
。请注意,如果此设置关闭且没有状态文件,则会处理 Journal 中的所有消息,即使已在以前的 rsyslog 会话中处理。
您可以将 imjournal
与作为传统系统日志输入的 imuxsock
模块同时使用。但是,为了避免消息重复,您必须防止 异常
读取日志的系统套接字。要做到这一点,使用 SysSock.Use
指令:
module(load”imjournal”) module(load”imuxsock” SysSock.Use=”off” Socket="/run/systemd/journal/syslog")
您可以将 Journal 存储的所有数据和元数据转换为结构化消息。其中一些元数据条目在 例 23.19 “详细 journalctl Output” 中列出,有关 journal 字段的完整列表请查看 systemd.journal-fields(7)
手册页。例如,可以专注于 内核日志字段,这些字段由内核中源自的消息使用。
23.8.2. 过滤结构化消息
要创建 rsyslog的解析模块所需的 lumberjack 格式的消息,请使用以下模板:
template(name="CEETemplate" type="string" string="%TIMESTAMP% %HOSTNAME% %syslogtag% @cee: %$!all-json%\n")
此模板将 @cee:
字符串前缀放在 JSON 字符串中,例如,在创建带有 omfile
模块的输出文件时应用。若要访问 JSON 字段名称,请使用 $! 前缀。例如,以下过滤器条件使用特定主机名和 UID 搜索消息:
($!hostname == "hostname" && $!UID== "UID")
23.8.3. 解析 JSON
mmjson 稀
疏模块用于解析结构化消息。
这些消息可以来自 日志 或其他输入源,并且必须通过 Lumberjack 项目定义的方式格式化。这些消息通过存在 @cee: 字符串来标识。然后,mmjson
稀疏检查 JSON 结构是否有效,然后解析消息。
要使用 mmjsonparse
解析 lumberjack 格式的 JSON 消息,请在 /etc/rsyslog.conf
中使用以下配置:
module(load”mmjsonparse”)
. :mmjsonparse:
在本例中,mmjsonparse
模块加载到第一行,然后所有消息都转发到它。目前,没有可用于 mmjson 稀疏的配置参数
。
23.8.4. 在 MongoDB 中存储消息
rsyslog 支持通过 the ommongodb 输出模块将 JSON 日志存储在 MongoDB 文档数据库中。
要将日志消息转发到 MongoDB,请在 /etc/rsyslog.conf
中使用以下语法( ommongodb 的配置参数仅以新配置格式可用),请参阅 第 23.3 节 “使用新配置格式”:
module(load”ommongodb”)
. action(type="ommongodb" server="DB_server" serverport="port" db="DB_name" collection="collection_name" uid="UID" pwd="password")
-
使用 MongoDB 服务器的名称或地址替换 DB_server。指定从 MongoDB 服务器中选择非标准端口的端口。默认 端口 值为
0
,通常不需要更改此参数。 - 使用 DB_name,您可以识别您要将输出定向到 MongoDB 服务器上的数据库。将 collection_name 替换为此数据库中集合的名称。在 MongoDB 中,集合是一组文档,等同于 RDBMS 表。
- 您可以通过替换 UID 和密码来设置登录详细信息。
您可以使用模板来构建最终数据库输出的形式。默认情况下,r syslog 使用基于标准 lumber jack 字段名称的模板。