Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

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 字段名称的模板。