本文主要介绍 Logstash 的一些常用过滤插件;相关的环境及软件信息如下:CentOS 7.9、Logstash 8.2.2。
1、grok 过滤插件
grok 是一种将行与正则表达式匹配,将行的特定部分映射到专用字段中以及根据此映射执行操作的方法。Logstash 中内置了超过 200 种 Logstash 模式,用于过滤单词、数字和日期等。 如果找不到所需的模式,可以自定义模式。 还有多个匹配模式的选项,可简化表达式的编写以捕获日志数据。
Logstash grok 过滤插件的基本语法格式:
grok 可以非结构化的数据转变为结构化数据,非常适用于各类系统日志;下面使用 Grok 来处理 Nginx访问日志。
一行 Nginx 访问日志:
配置 Logstash:
运行 Logstash 后输入日志信息:
可以看到各字段信息都解析出来了。
各正则表达式定义的详细信息,可以参考 https://github.com/logstash-plugins/logstash-patterns-core/tree/main/patterns,如:
2、dissect 过滤插件
基于分隔符原理解析数据,解决grok解析时消耗过多cpu资源的问题。使用分隔符将非结构化事件数据提取到字段中。 解剖过滤器不使用正则表达式,速度非常快。 但是,如果数据的结构因行而异,grok 过滤器更合适。dissect 的应用有一定的局限性:主要适用于每行格式相似且分隔符明确简单的场景。
dissect 语法比较简单,有一系列字段(field)和分隔符(delimiter)组成
使用 Dissect 处理 Nginx 访问日志:
结果如下,与使用 grok 处理 Nginx 访问日志的结果一致:
dissect 除了字段外面的字符串定位功能以外,还通过几个特殊符号来处理字段提取的规则:
- %{+key} +代表该匹配值追加到 key 字段下
- %{+key/2} 后面的数字代表拼接的次序
- %{} 表示一个空的跳过字段
- %{?key} ?表示,这块只是一个占位,并不会实际生成捕获字段存到事件里面。
- %{?key} %{&key}当同样捕获名称都是string,但是一个?一个&的时候,表示这是一个键值对。
- %{key->},表示忽略它右边的填充,否则右边的多余填充将拆分到下一个字段中。
3、date 过滤插件
date 过滤插件可以把字符串的日期字段转为日期类型。
上述配置把 accessTimeStr 字段的值转成日期类型,并写入 accessTime 字段(默认为 @timestamp 字段)。运行 Logstash:
4、mutate 过滤插件
mutate 插件可以对字段进行重命名、删除、替换、更新等操作:
- convert 类型转换
- gsub 字符串替换
- split 字符串分割
- join 数组合转为字符串
- merge 数组合并为数组
- rename 字段重命名
- update 字段内容更新,如果字段不存在,则不处理
- replace 字段内容替换,如果字段不存在,则新增字段
启动 Logstash 并在控制输入测试数据:
5、json 过滤插件
json 插件可以把内容为 json 字符串的字段转换为 json 格式数据。
启动 Logstash 并在控制输入测试数据:
6、ruby 过滤插件
ruby 插件时最灵活的插件,可以使用 ruby 来随心所欲的修改 Logstash Event 对象。
启动 Logstash 并在控制输入测试数据:
本文中介绍的插件只是 Logstash 输入插件的很小的一部分,可查看 Logstash 官方文档 了解更多信息。