📙
iLogtail用户手册
Pre-Release
Pre-Release1.3.01.2.11.1.11.1.01.4.01.5.01.6.01.7.11.8.42.0.4
Pre-Release
Pre-Release1.3.01.2.11.1.11.1.01.4.01.5.01.6.01.7.11.8.42.0.4
  • 关于
    • 什么是LoongCollector
    • 发展历史
    • 产品优势
    • 开源协议
    • 社区版和企业版的对比说明
  • 安装
    • 快速开始
    • Docker使用
    • Kubernetes使用
    • 守护进程
    • 目录结构说明
    • iLogtail 兼容模式使用指南
    • 支持的操作系统
    • 源代码
      • 下载
      • 编译
      • Docker镜像
      • 编译依赖
    • 发布记录
      • LoongCollector 发布记录
      • iLogtail 发布记录(2.x版本)
      • iLogtail 发布记录(1.x版本)
  • 配置
    • 采集配置
    • 系统参数
    • 日志
  • 插件
    • 概览
    • 版本管理
    • 输入插件
      • 什么是输入插件
      • 原生输入插件
        • 文本日志
        • 容器标准输出
        • eBPF网络可观测数据
        • eBPF进程安全数据
        • eBPF网络安全数据
        • eBPF文件安全数据
        • 自监控指标数据
        • 自监控告警数据
      • 扩展输入插件
        • 容器标准输出
        • 脚本执行数据
        • Kubernetes元信息采集
        • 主机Meta数据
        • 主机监控数据
        • MySQL Binlog
        • GO Profile
        • GPU数据
        • HTTP数据
        • Journal数据
        • Kafka
        • SqlServer 查询数据
        • OTLP数据
        • PostgreSQL 查询数据
        • 收集 SNMP 协议机器信息
        • Syslog数据
        • 【示例】MetricInput
        • 【示例】ServiceInput
        • 【Debug】Mock数据-Metric
        • 【Debug】Mock数据-Service
        • 【Debug】文本日志
    • 处理插件
      • 什么是处理插件
      • SPL处理插件
        • SPL 处理
      • 原生处理插件
        • 正则解析
        • 分隔符解析
        • Json解析
        • 时间解析
        • 过滤
        • 脱敏
      • 扩展处理插件
        • 添加字段
        • 追加字段
        • 添加云资产信息
        • 原始数据
        • 分隔符
        • 数据脱敏
        • 字段值映射处理
        • 丢弃字段
        • 字段加密
        • 条件字段处理
        • 日志过滤
        • 时间提取(Go 时间格式)
        • Grok
        • Json
        • 日志转SLS Metric
        • otel Metric格式转换
        • otel Trace格式转换
        • 字段打包
        • 日志限速
        • 正则
        • 重命名字段
        • 键值对
        • 多行切分
        • 字符串替换
        • 时间提取(strptime 格式)
    • 聚合插件
      • 什么是聚合插件
      • 基础聚合
      • 按上下文分组
      • 按Key分组
      • 按GroupMetadata分组
    • 输出插件
      • 什么是输出插件
      • 原生输出插件
        • SLS
        • 本地文件
        • 【Debug】Blackhole
        • 多Flusher路由
      • 扩展输出插件
        • ClickHouse
        • ElasticSearch
        • HTTP
        • KafkaV2
        • Kafka(Deprecated)
        • OTLP日志
        • Prometheus
        • Pulsar
        • 标准输出/文件
        • Loki
    • 扩展插件
      • 什么是扩展插件
      • BasicAuth鉴权
      • 协议解码/反序列化
      • 协议编码/序列化
      • 数据筛选
      • 请求熔断
  • 工作原理
    • 插件系统
  • 开发者指南
    • 开发环境
    • 代码风格
    • 数据模型(C++)
    • 数据模型(Golang)
    • 日志协议
      • 什么是日志协议
      • 协议转换
      • 增加新的日志协议
      • 协议
        • sls协议
        • 单条协议
        • raw协议
    • 自监控
      • 指标
        • 自监控指标说明
        • 如何收集自监控指标
        • 如何添加自监控指标
      • 告警
        • 自监控告警说明
    • 插件开发
      • 开源插件开发引导
      • 原生插件开发
        • 如何开发原生Input插件
        • 如何开发原生Flusher插件
      • 扩展插件开发
        • 如何开发扩展Input插件
        • 如何开发扩展Processor插件
        • 如何开发扩展Aggregator插件
        • 如何开发扩展Flusher插件
        • 如何开发Extension插件
        • 如何开发外部私有插件
        • 如何自定义构建产物中默认包含的插件
        • 插件配置项基本原则
      • 插件文档开发
        • 如何生成插件文档
        • 插件文档规范
      • 插件调试
        • Logger接口
        • Golang 自监控指标接口
        • 纯插件模式启动
    • 测试
      • 单元测试
      • E2E测试
      • E2E测试——如何添加新的测试行为
      • E2E测试——如何编写Subscriber插件
      • Benchmark测试
    • 代码检查
      • 检查代码规范
      • 检查文件许可证
      • 检查依赖包许可证
  • 贡献指南
    • 贡献指南
    • 开发者
    • 成就
  • 性能测试
    • 容器场景iLogtail与Filebeat性能对比测试
  • 管控工具
    • 使用介绍
    • 通信协议
    • 开发指南
  • 社区活动
    • 开源之夏 2024
      • 开源之夏 2024 活动介绍
      • 项目
        • iLogtail 社区项目介绍
        • iLogtail 数据吞吐性能优化
        • ConfigServer 能力升级 + 体验优化(全栈)
  • Awesome LoongCollector
    • 走近LoongCollector社区版
    • LoongCollector社区版开发使用经验
Powered by GitBook
On this page
  • 简介
  • 版本
  • 版本说明
  • 配置参数
  • 样例
  • Grok 模式
  • 效率与优化
  • 正则引擎
  • 优化匹配失败时间
  • 多项匹配优化
  1. 插件
  2. 处理插件
  3. 扩展处理插件

Grok

Previous时间提取(Go 时间格式)NextJson

Last updated 1 month ago

简介

processor_grok插件可以通过 Grok 语法匹配的模式,实现文本日志的字段提取。

版本

版本说明

  • 推荐版本:iLogtail v1.4.0 及以上

配置参数

参数
类型,默认值
说明

Type

String,无默认值(必填)

插件类型,固定为processor_grok

CustomPatternDir

Array,其中 value 为 String,[]

自定义的GROK模式所在的文件夹地址,会读取文件夹内的所有文件。需要重启生效。

CustomPatterns

Map,其中 key 和 value 为 String,{}

自定义的GROK模式,key 为规则名,value 为 grok 表达式。

SourceKey

String,content

需要匹配的目标字段。

Match

Array,其中 value 为 String,[]

TimeoutMilliSeconds

Long,0

解析 grok 表达式的最大尝试时间,单位为毫秒,设置为 0 禁用超时。

IgnoreParseFailure

Boolean,true

指定解析失败后的操作,不配置表示放弃解析,直接填充所返回的 content 字段。配置为 false ,表示解析失败时丢弃日志。

KeepSource

Boolean,true

是否保留原字段。

NoKeyError

Boolean,false

无匹配的原始字段时是否报错。

NoMatchError

Boolean,true

Match 中的表达式全不匹配时是否报错。

TimeoutError

Boolean,true

匹配超时是否返回错误。

样例

采集/home/test-log/路径下的processor-grok.log文件,根据指定的配置选项提取日志信息。

  • 采集配置

enable: true
  - Type: input_file
    FilePaths: 
      - /home/test-log/*.log
processors:
  - Type: processor_grok
    SourceKey: content
    KeepSource: false
    CustomPatterns:
      HTTP: '%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}'
    Match: 
      - '%{HTTP}'
      - '%{WORD:word1} %{NUMBER:request_time} %{WORD:word2}'
      - '%{YEAR:year} %{MONTH:month} %{MONTHDAY:day} %{QUOTEDSTRING:motto}'
    IgnoreParseFailure: false
flushers:
  - Type: flusher_stdout
    OnlyStdout: true
  • 输入1

echo 'begin 123.456 end' >> /home/test-ilogtail/test-log/processor-grok.log
  • 输出1


{
  "__tag__:__path__":"/home/test-ilogtail/test-log/processor-grok.log",
  "word1":"begin",
  "request_time":"123.456",
  "word2":"end",
  "__time__":"1662618045"
}
  • 输入2

echo '2019 June 24 "I am iron man"' >> /home/test-ilogtail/test-log/processor-grok.log
  • 输出2

{
  "__tag__:__path__":"/home/test-ilogtail/test-log/processor-grok.log",
  "year":"2019",
  "month":"June",
  "day":"24",
  "motto":"\"I am iron man\"",
  "__time__":"1662618059"
}
  • 输入3

echo 'WRONG LOG' >> /home/test-ilogtail/test-log/processor-grok.log
  • 输出3

{
  "__tag__:__path__":"/home/test-ilogtail/test-log/processor-grok.log",
  "__time__":"1662618069"
}
  • 输入4

echo '10.0.0.0 GET /index.html 15824 0.043' >> /home/test-ilogtail/test-log/processor-grok.log
  • 输出4

{
  "__tag__:__path__":"/home/test-ilogtail/test-log/processor-grok.log",
  "client":"10.0.0.0",
  "method":"GET",
  "request":"/index.html",
  "bytes":"15824",
  "duration":"0.043",
  "__time__":"1662618081"
}
  • 输出说明

在样例一中,processor_grok 插件首先使用 Match 中的第一个表达式 '%{HTTP}' 匹配日志,失败后进行下一个尝试。然后匹配 Match 中的第二个表达式 '%{WORD:word1} %{NUMBER:request_time} %{WORD:word2}' 成功,返回结果。由于 KeepSource 参数设置为 false,所以原日志的 content 的字段被丢弃了。 样例二、样例四与样例一类似,分别使用 Match 中的第三和第一个表达式成功匹配日志。 在样例三中,processor_grok 插件使用 Match 中的三个表达式均匹配失败,所以没有任何结果。又因为 IgnoreParseFailure 设置为了 false,所以匹配失败的样例输出三的 content 字段被丢弃了。

Grok 模式

效率与优化

正则引擎

优化匹配失败时间

Grok 语法在匹配失败的情况下时间开销巨大。为了提高插件解析的效率,必须优化匹配失败的时间,这里给出几种可以优化匹配失败时间的思路。

  • 表达式与数据尽量完全匹配

  • 在 grok 表达式中添加锚点,例如^、$等,减少不必要的匹配尝试

  • 设置超时时间,即配置参数中的 TimeoutMilliSeconds 参数

多项匹配优化

因此,在使用 processor_grok 插件时,最好尽量不使用多项匹配,或者 Match 中设置尽可能少的 Grok 表达式。也可以通过减少重复的匹配,来优化效率。下面是使用分层策略减少重复匹配的一个样例。

  • 输入

输入共三条数据

'8.8.8.8 process-name[666]: a b 1 2 a lot of text at the end'
'8.8.8.8 process-name[667]: a 1 2 3 a lot of text near the end;4'
'8.8.8.8 process-name[421]: a completely different format | 1111'
  • 常规配置

标准的多项匹配,一个一个匹配完整的表达式。


processors:
  - Type: processor_grok
    SourceKey: content
    Match: 
      - '%{IPORHOST:clientip} %{DATA:process_name}\[%{NUMBER:process_id}\]: %{WORD:word_1} %{WORD:word_2} %{NUMBER:number_1} %{NUMBER:number_2} %{DATA:data}'    
      - '%{IPORHOST:clientip} %{DATA:process_name}\[%{NUMBER:process_id}\]: %{WORD:word_1} %{NUMBER:number_1} %{NUMBER:number_2} %{NUMBER:number_3} %{DATA:data};%{NUMBER:number_4}'
      - '%{IPORHOST:clientip} %{DATA:process_name}\[%{NUMBER:process_id}\]: %{DATA:data} \| %{NUMBER:number}'
  • 优化配置

先统一处理前半部分,然后统一处理后半部分

processors:
  - Type: processor_grok
    SourceKey: content
    Match: 
      - '%{IPORHOST:clientip} %{DATA:process_name}\[%{NUMBER:process_id}\]: %{GREEDYDATA:content_2}'
    KeepSource: false
  - Type: processor_grok
    SourceKey: content_2
    Match: 
      - '%{WORD:word_1} %{WORD:word_2} %{NUMBER:number_1} %{NUMBER:number_2} %{GREEDYDATA:data}'
      - '%{WORD:word_1} %{NUMBER:number_1} %{NUMBER:number_2} %{NUMBER:number_3} %{DATA:data};%{NUMBER:number_4}'
      - '%{DATA:data} \| %{NUMBER:number}'
    KeepSource: false

用来匹配的 Grok 表达式数组。Grok 插件会从上至下依次使用 Match 中的表达式对日志进行匹配,并返回第一个匹配成功的结果。配置多条会影响性能,可以参考

processor_grok 插件主要使用 SLS 的 。SLS数据加工提供了 70+ 常用的 GROK 模式,例如身份证号、邮箱、MAC 地址、IPV4、IPV6、时间解析、URL 解析等。此外,还整合了一些其他通用的 Grok 模式。

所有的 Grok 模式模版请见。

由于 Golang 原生的 regexp 库不支持一些高级的正则语法,故 processor_grok 的正则引擎使用第三方的 库。regexp2 库与 Golang 原生的 regexp 的简单性能对比可以参考源代码中的 。

processor_grok 插件支持多项匹配,即可以在 Match 中设置多个 Grok 表达式,依次对日志进行匹配尝试。但使用多项匹配时,由于需要一个个匹配合适的表达式,会经历很多匹配失败的情况。可以参考源代码中的 ,其对 Match 中有1、2、3、5条表达式的情况,分别做了简单的模拟匹配失败的性能测试,可以看出效率是成倍降低的。

源代码
Beta
GROK 模式
链接
regexp2
Benchmark 测试
Benchmark 测试
效率与优化