Fluentbit 入门教程(2):使用正则表达式解析日志
背景和概述
如果没有正确的解析,日志数据可能难以有效解释和使用,从而导致潜在的问题,例如增加故障排除时间或错过检测重要事件的机会。在 Fluent Bit 中解析数据非常重要,因为它允许用户从非结构化或半结构化日志数据中提取相关信息。然后可以进一步处理、分析提取的数据并将其发送到各种输出。它有助于理解日志数据并将其转化为有价值的见解。
解析数据时,正则表达式允许用户定义与日志数据的特定部分匹配的复杂模式,例如时间戳、错误消息或 IP 地址。这提供了一种强大而灵活的方法来从日志数据中提取和组织相关信息,使其更易于理解、分析和采取行动。
在本博客中,作为学习 Fluent Bit 的第二个练习,我们将使用正则表达式解析获得的日志数据。如果您想从头开始学习,可以参考第一篇博客《Fluentbit 入门教程(1):tail 插件》。
Fluentbit 实验环境
- 操作系统:CentOS8
- Fluent Bit 版本:v2.0.6
- 硬件规格:2CPU,2GB内存
目录结构和日志文件
就像我们的第一篇博客一样,我们将使用 Fluent Bit 中的“tail”插件从典型的 Linux 日志文件中获取数据。目录结构和日志文件也将保持不变。
本案例的目录结构如下:
/fluentbit : root directory
|--- conf
|--- custom_parsers.conf
|--- Lab01
|-- (Lab01 configuration files)
|-- sample
|-- (Sample log files for exercise)
|--- log
|--- buffer
这是我们将尝试解析的示例 Linux 日志:sample01_linux_messages.txt
Oct 27 16:14:31 fluent01 systemd[1]: Started dnf makecache.
Oct 27 16:20:29 fluent01 systemd[1]: Starting system activity accounting tool...
Oct 27 16:20:29 fluent01 systemd[1]: Started system activity accounting tool.
Oct 27 16:40:29 fluent01 kubelet[896]: W1027 16:40:29.280967 896 watcher.go:95] Error while processing event ("/sys/fs/cgroup/cpu,cpuacct/system.slice/sysstat-collect.service": 0x40000100 == IN_CREATE|IN_ISDIR): inotify_add_watch /sys/fs/cgroup/cpu,cpuacct/system.slice/sysstat-collect.service: no such file or directory
Oct 27 16:40:29 fluent01 kubelet[896]: W1027 16:40:29.281027 896 watcher.go:95] Error while processing event ("/sys/fs/cgroup/blkio/system.slice/sysstat-collect.service": 0x40000100 == IN_CREATE|IN_ISDIR): inotify_add_watch /sys/fs/cgroup/blkio/system.slice/sysstat-collect.service: no such file or directory
Oct 27 16:40:29 fluent01 kubelet[896]: W1027 16:40:29.281048 896 watcher.go:95] Error while processing event ("/sys/fs/cgroup/memory/system.slice/sysstat-collect.service": 0x40000100 == IN_CREATE|IN_ISDIR): inotify_add_watch /sys/fs/cgroup/memory/system.slice/sysstat-collect.service: no such file or directory
现在让我们继续练习解析这些数据!
Fluentbit 配置练习
在之前的练习中,Fluent Bit 只是从目标文件读取日志消息并将其刷新到标准输出。默认情况下,整个消息嵌套在“log”键下,但在某些情况下您可能希望捕获特定信息。以下日志中包含以下信息:
Oct 27 16:14:31 fluent01 systemd[1]: Started dnf makecache.
- Timestamp : Oct 27 16:14:31
- Hostname : fluent01
- Ident : systemd
- Process ID : 1
- Message Body : Started dnf makecache
第 1 步:创建正则表达式
这是一种使用正则表达式(“regex”)定义自定义解析规则的方法。下面显示了示例正则表达式和日志模式的输出。
正则表达式:
/^(?<time>[^ ]* {1,2}[^ ]* [^ ]*) (?<host>[^ ]*) (?<ident>[a-zA-Z0-9_\/\.\-]*)(?:\[(?<pid>[0-9]+)\])?(?:[^\:]*\:)? *(?<message>.*)$/
输出:
{
"time" : "Oct 27 16:14:31",
"host" : "fluent01",
"ident" : "systemd",
"pid" : "1",
"message" : "Started dnf makecache."
}
Rubular 和 Regex101 对于尝试正则表达式非常有用。
第 2 步:定义自定义解析器
一旦您的正则表达式准备就绪,下一步就是为 Fluent Bit 定义自定义解析器。我们通常准备“custom_parsers.conf”并在 [SERVICE]
部分中指定它。
以下是 Linux 操作系统日志消息的自定义解析器定义示例。您可以在“正则表达式”选项中找到自定义正则表达式。
[PARSER]
Name syslog-messages
Format regex
Regex /^(?<time>[^ ]* {1,2}[^ ]* [^ ]*) (?<host>[^ ]*) (?<ident>[a-zA-Z0-9_\/\.\-]*)(?:\[(?<pid>[0-9]+)\])?(?:[^\:]*\:)? *(?<message>.*)$/
Time_Key time
Time_Format %b %d %H:%M:%S
Time_Keep On
正如我们在第一篇博客中所述,Fluent Bit 使用读取日志文件时的时间作为时间戳,这可能会导致原始消息中的时间戳之间不匹配。时间设置“Time_key”、“Time_format”和“Time_keep”有助于避免不匹配。
- Time_key: 指定提供时间信息的字段名称。
- Time_format: 指定时间字段的格式,以便可以正确识别和分析。
- 默认情况下,当识别并解析时间键时,解析器将删除原始时间字段。通过启用此选项,Fluent Bit 不会用处理日志消息的时间覆盖时间戳,而是保留日志消息本身中记录的时间戳。
在示例解析器中,我们将时间戳捕获为“time”键,时间格式为“Oct 27 16:14:31”,可以标准化为“%b %d %H:%M:%S”。有关标准化时间格式的方法,请尝试查看此页面。
第 3 步:使用自定义解析器运行 Fluent Bit
让我们使用自定义解析器运行 Fluent Bit!自定义解析器配置到文件 custom_parsers.conf 中:
[PARSER]
Name syslog-messages
Format regex
Regex /^(?<time>[^ ]* {1,2}[^ ]* [^ ]*) (?<host>[^ ]*) (?<ident>[a-zA-Z0-9_\/\.\-]*)(?:\[(?<pid>[0-9]+)\])?(?:[^\:]*\:)? *(?<message>.*)$/
Time_Key time
Time_Format %b %d %H:%M:%S
Time_Keep On
之后,我们在 tail 这个 INPUT 插件里把 Parser(syslog-messages)写上,同时注意把 Parsers_File 指向 custom_parsers.conf 的路径:
[SERVICE]
## General settings
Flush 5
Log_Level Info
Daemon off
Log_File /fluentbit/log/fluentbit.log
Parsers_File /fluentbit/conf/custom_parsers.conf
## Buffering and Storage
Storage.path /fluentbit/buffer/
Storage.sync normal
Storage.checksum Off
Storage.backlog.mem_limit 5M
Storage.metrics On
## Monitoring (if required)
HTTP_Server true
HTTP_Listen 0.0.0.0
HTTP_Port 2020
Health_Check On
HC_Errors_Count 5
HC_Retry_Failure_Count 5
HC_Period 60
[INPUT]
Name tail
Tag linux.messages
Path /fluentbit/conf/Lab01/sample/sample01_linux_messages.txt
Storage.type filesystem
Read_from_head true
DB /fluentbit/tail_linux_messages.db
Parser syslog-messages
[OUTPUT]
Name stdout
Match linux.messages
让我们使用示例配置运行 Fluent Bit:
您可能需要删除“DB”文件 /fluentbit/tail_linux_messages.db 以使 Fluent Bit 从头开始读取该行。
$ fluent-bit -c sample02_flb_tail_custom_parser.conf
您可以在标准输出中看到解析后的消息。
[0] linux.messages: [1666887271.000000000, {"time"=>"Oct 27 16:14:31", "host"=>"fluent01", "ident"=>"systemd", "pid"=>"1", "message"=>"Started dnf makecache."}]
[1] linux.messages: [1666887629.000000000, {"time"=>"Oct 27 16:20:29", "host"=>"fluent01", "ident"=>"systemd", "pid"=>"1", "message"=>"Starting system activity accounting tool..."}]
[2] linux.messages: [1666887629.000000000, {"time"=>"Oct 27 16:20:29", "host"=>"fluent01", "ident"=>"systemd", "pid"=>"1", "message"=>"Started system activity accounting tool."}]
[3] linux.messages: [1666888829.000000000, {"time"=>"Oct 27 16:40:29", "host"=>"fluent01", "ident"=>"kubelet", "pid"=>"896", "message"=>"W1027 16:40:29.280967 896 watcher.go:95] Error while processing event ("/sys/fs/cgroup/cpu,cpuacct/system.slice/sysstat-collect.service": 0x40000100 == IN_CREATE|IN_ISDIR): inotify_add_watch /sys/fs/cgroup/cpu,cpuacct/system.slice/sysstat-collect.service: no such file or directory"}]
[4] linux.messages: [1666888829.000000000, {"time"=>"Oct 27 16:40:29", "host"=>"fluent01", "ident"=>"kubelet", "pid"=>"896", "message"=>"W1027 16:40:29.281027 896 watcher.go:95] Error while processing event ("/sys/fs/cgroup/blkio/system.slice/sysstat-collect.service": 0x40000100 == IN_CREATE|IN_ISDIR): inotify_add_watch /sys/fs/cgroup/blkio/system.slice/sysstat-collect.service: no such file or directory"}]
[5] linux.messages: [1666888829.000000000, {"time"=>"Oct 27 16:40:29", "host"=>"fluent01", "ident"=>"kubelet", "pid"=>"896", "message"=>"W1027 16:40:29.281048 896 watcher.go:95] Error while processing event ("/sys/fs/cgroup/memory/system.slice/sysstat-collect.service": 0x40000100 == IN_CREATE|IN_ISDIR): inotify_add_watch /sys/fs/cgroup/memory/system.slice/sysstat-collect.service: no such file or directory"}]
- 正如预期的那样,有“time”、“host”、“ident”、“pid”和“message”字段。
- 另外,Fluent Bit 写入的时间戳与原始消息中的时间戳相同。
太棒了,你完成了第二个练习!您现在知道如何使用“tail”插件和正则表达式解析日志消息。在下一篇博客中,您将学习如何解析具有多个日志行的日志消息。
总结
在本博客中,我们学习了如何使用正则表达式在 Fluent bit 中解析日志消息。正则表达式是一种强大的工具,可以帮助用户从非结构化或半结构化日志数据中提取有用的信息。我们还了解了如何定义自定义解析器,以便 Fluent Bit 可以正确解析日志消息。这是学习 Fluent Bit 的重要一步,因为它有助于理解日志数据并将其转化为有价值的见解。
原文:https://fluentd.ctc-america.com/blog/parsing-in-fluent-bit-using-regular-expression