Logstash有自己的filter过滤插件,专门用来对日志进行切割,过滤,最终保留日志中自己需要的部分,删除日志中多余的部分,将过滤出来的日志写入到elasticsearch中。Logstash官方文档中介绍的logstash的过滤插件大概有四十多种,logstash常用的过滤插件有grok、mutate、date、kv、geoip插件等。
一、grok 插件
Grok是Logstash最主要的过滤插件,Grok是一种通过正则表达式将非结构化日志数据解析为结构化和可查询的数据的插件。以下列举几种常见的配置参数,其他配置参数详见官档。
1、match 正则
- 内置数据类型
# 可以匹配一条或多条规则
grok {
"match" => { "message" => '%{IPORHOST:clientip} %{DATA:process_name}\[%{NUMBER:process_id}\]: %{GREEDYDATA:message}'},
"overwrite" => "message"
}
grok {
"match" => { "message" => [
'%{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}']
}
}
- 自定义数据类型
# cat patterns
TIME %{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{HOUR}:%{SECOND}:%{MINUTE}.%{SSS}
LOG1 %{LOGLEVEL:loglevel}[T ]\[%{GREEDYDATA:servername},,,\][T ]%{PID:pid}[T ]---[T ]\[%{GREEDYDATA:loop}\][T ]%{GREEDYDATA:log}
LOG2 %{PID:pid}[T ]---[T ]%{GREEDYDATA:message}
# cat logstash.conf
...
grok {
patterns_dir => ["./patterns"]
match => ["message", "%{TIMESTAMP_ISO8601:logdate} %{LOGLEVEL:loglevel}[T ]\[%{GREEDYDATA:servername},,,\][T ]%{LOG2:logtest}"]
}
...
2、Reference
-
grok 规则在线测试
https://grokdebug.herokuapp.com/ -
grok官档
https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html -
官方已有默认类型
https://blog.csdn.net/qq_25854057/article/details/121522310
https://github.com/logstash-plugins/logstash-patterns-core/tree/main/patterns
3、grok 注意事项
- grok匹配问题,在同一正则表达式中不要出现两个通配(.*)
二、mutate 插件
mutate过滤器可以讲字段执行常规变化。您可以重命名、删除、替换和修改事件中的字段。以下列举几种常见的配置参数,其他配置参数详见官档。
1、coerce
- 如果某个字段已经存在,并且它的值是null,那么我们可以使用coerce来为它设置默认值
mutate {
# Sets the default value of the 'field1' field to 'default_value'
coerce => { "field1" => "default_value" }
}
2、rename
- 对字段进行重命名
mutate {
rename => {"shortHostname" => "hostname"}
}
3、update
- 更新字段的值,更新的字段必须要存在,否则没有任何效果
mutate {
update => { "sample" => "My new message" }
}
4、convert
- 数据类型转换
- 可转换类型有integer、integer_eu、float、float_eu、string、boolean
mutate {
convert => {
"fieldname" => "integer"
"booleanfield" => "boolean"
}
5、gsub
- 对字段内容进行替换
mutate {
gsub => [
# 第一列是字段(string类型或string数组),第二列是替换前字符(支持正则),第三列是替换后字符
"fieldname", "/", "_",
"fieldname2", "[\\?#-]", "."
]
}
6、uppercase、capitalize、lowercase
- 大写、首字母大写、小写
mutate {
lowercase => [ "fieldname" ]
}
7、strip
- 去除字段首尾空格
mutate {
strip => ["field1", "field2"]
}
8、remove_field、add_field
- 移除、添加字段
mutate {
remove_field => [ "foo_%{somefield}", "my_extraneous_field" ]
add_field => {
"foo_%{somefield}" => "Hello world, from %{host}"
"new_field" => "new_static_value"
}
}
9、split
- 使用分隔符将字段拆分为数组。仅适用于字符串字段。
mutate{
split => ["message","|"] #按 | 进行split切割message
add_field => {
"requestId" => "%{[message][0]}"
}
add_field => {
"timeCost" => "%{[message][1]}"
}
}
mutate {
split => { "fieldname" => "," }
}
10、merge
- 字段合并
- 可以合并的类型
`array` + `string` will work
`string` + `string` will result in an 2 entry array in `dest_field`
`array` and `hash` will not work
mutate {
merge => { "dest_field" => "added_field" }
}
11、Reference
三、date 插件
日期过滤器用于解析字段中的日期,然后使用该日期或时间戳作为事件的日志存储时间戳。
1、target
- 业务日志时间戳覆盖 timestamp
date {
match => ["logdate", "yyyy-MM-dd HH:mm:ss"]
target => "@timestamp"
}
2、Reference
https://www.elastic.co/guide/en/logstash/current/plugins-filters-date.html
四、kv 插件
kv插件是对键值数据进行解析,如foo=bar。
1、field_split
- 用作单个字符字段分隔符的字符串,用于解析出键值对
# 请求url中常见路径参数
# pin=12345~0&d=123&e=foo@bar.com&oq=bobo&ss=12345
kv {
source => "fieldname" # 默认是message,可以指定其他字段
field_split => "&?"
allow_duplicate_values => false # 是否允许重复键值
}
2、exclude_keys、include_keys
- 包含、排除某些键值
kv {
exclude_keys => [ "from", "to" ]
include_keys => [ "from2", "to2" ]
}
3、value_split
- 对值进行拆分
kv {
value_split => ":" }
}
五、公共参数
所有筛选器插件都支持以下配置选项,只有筛选成功才能执行。
1、add_field、remove_field
- 如果此筛选成功,可以从事件中添加删除任意字段
grok {
add_field => {
"foo_%{somefield}" => "Hello world, %{somefield}"
"new_field" => "new_static_value"
}
remove_field => ["message"]
}
2、add_tag,remove_tag
- 如果此筛选成功,可以从事件中添加删除任意标记
kv {
add_tag => [ "foo_%{somefield}" ]
}
mutate {
remove_tag => [ "foo_%{somefield}" ]
}
总结:
可以看到基本上每个插件都有公共配置参数add_field、add_tag、remove_field、remove_tag,那这些到底放在哪个插件中使用是取决于实际情况,因为只有插件过滤成功才能从事件中添加移除。另外每个插件中都有一个 tag_on_failure 参数,grok 过滤失败会在tags字段添加 _grokparsefailure,kv 过滤失败会在tags字段添加 _kv_filter_error,其他插件同理,过滤失败都会在tags字段添加响应的元素值便于判断。
Reference:
https://blog.csdn.net/qq_25854057/article/details/121522310
https://www.elastic.co/guide/en/logstash/current/filter-plugins.html
https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html
https://www.elastic.co/guide/en/logstash/current/plugins-filters-mutate.html
https://www.elastic.co/guide/en/logstash/current/plugins-filters-date.html
https://www.elastic.co/guide/en/logstash/current/plugins-filters-kv.html