You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:01:27