在Fluentd中解析日志:基于键值创字段及用Grok/JSON提取指定字段
嘿,关于Fluentd日志解析的这两个问题,我刚好有不少实操经验,给你一步步拆解~
1. Fluentd中解析日志并生成键值对字段的通用思路
在Fluentd里实现日志解析并生成键值对字段,核心是用**parser过滤器**(这是最常用的解析工具),整体流程大概是这样:
- 先明确日志格式:先搞清楚你的日志是JSON结构、纯文本(比如Nginx/Java风格)还是其他格式,对应选择合适的解析类型(
json、grok、regexp等) - 配置
parser过滤器:指定要解析的目标字段(比如日志内容存在log字段里,就设key_name log),然后在<parse>块里定义解析规则 - 处理解析细节:可以用
reserve_data true保留原有的其他字段(比如时间、流信息),用replace_invalid_sequence处理非法字符避免解析失败 - 测试验证:用
fluentd -c 你的配置文件.conf -v启动服务,或者用fluent-cat命令直接测试单条日志的解析结果
举个最简单的JSON解析例子,配置大概是这样:
<filter your_log_tag> @type parser key_name log # 指定要解析的字段是log <parse> @type json # 解析类型为JSON </parse> reserve_data true # 保留原有的其他字段 </filter>
2. 针对目标日志的具体解析方案
先看你给的日志:
{"log":"2019-08-09 06:54:36,774 INFO 10.2.1.200 [09/Aug/2019:06:54:36 +0000] "GET / HTTP/1.1" 200 205 "-" "HCELB/2.0"\n","stream":"stderr","time":"2019-08-09T06:54:36.77499244Z"}
外层是标准JSON,里面的log字段是Nginx风格的文本日志,所以需要分两步解析:先拆外层JSON,再解析内层log文本提取目标字段。下面给两种可行方案:
方案1:JSON解析 + Grok解析组合
这是最清晰的方式,先展开外层JSON,再用Grok解析log字段:
完整配置片段
# 第一步:解析外层JSON,展开所有字段 <filter your_log_tag> @type parser key_name message # 如果你的日志是通过input插件(比如tail)读取的,可能存在message字段里;如果直接是JSON输入,可调整 <parse> @type json </parse> reserve_data true </filter> # 第二步:用Grok解析log字段,提取ip、method、severity等字段 <filter your_log_tag> @type parser key_name log <parse> @type grok # Grok模式,对应log字段的文本格式 pattern %{DATE:log_date} %{TIME:log_time} %{LOGLEVEL:severity} %{IP:ip} \[%{HTTPDATE:request_time}\] "%{WORD:method} %{URIPATH:path} %{DATA:http_version}" %{NUMBER:status_code} %{NUMBER:response_size} "%{DATA:referrer}" "%{DATA:user_agent}" </parse> reserve_data true # 保留stream、time等原有字段 </filter>
关键Grok模式说明
%{LOGLEVEL:severity}:提取日志级别(比如这里的INFO)%{IP:ip}:提取客户端IP(比如10.2.1.200)%{WORD:method}:提取HTTP请求方法(比如GET)- 其他预定义模式(
DATE、TIME、HTTPDATE等)都是Fluentd Grok插件自带的,不用自己写正则
方案2:一次性用Multi格式解析(进阶)
如果想简化配置,也可以用multi_format同时处理外层JSON和内层Grok解析,不过可读性稍差:
<filter your_log_tag> @type parser key_name message <parse> @type multi_format <pattern> @type json </pattern> <pattern> @type grok pattern %{DATE:log_date} %{TIME:log_time} %{LOGLEVEL:severity} %{IP:ip} \[%{HTTPDATE:request_time}\] "%{WORD:method} %{URIPATH:path} %{DATA:http_version}" %{NUMBER:status_code} %{NUMBER:response_size} "%{DATA:referrer}" "%{DATA:user_agent}" </pattern> </parse> </filter>
注意事项
- 确保你的Fluentd安装了
parser_grok插件:如果是td-agent,一般自带;如果是原生Fluentd,需要执行gem install fluent-plugin-parser-grok - 测试Grok模式时,可以用Fluentd自带的
fluent-plugin-grok-parser测试命令,或者本地工具验证正则是否匹配
内容的提问来源于stack exchange,提问作者S Mohan
相关产品推荐
相关产品推荐

