一、介绍
Dissect filter 是一种分割操作。与常规拆分操作不同,其中一个分隔符应用于整个字符串,此操作将一组分隔符应用于字符串值。
Dissect不使用正则表达式,而且速度非常快。
但是,如果文本的结构因行而异,那么Grok更适合。
有一种混合的情况,可以使用Dissect来消除可靠重复的行的部分结构,然后Grok可以用于剩余的字段值,具有更高的regex可预测性,并且不需要做太多的总体工作。
二、示例
[root@es03 logstash]# cat dissect.conf
input { stdin {}}
filter {
dissect {
mapping => {
"message" => "%{ts} %{+ts} %{+ts} %{src} %{} %{prog}[%{pid}]: %{msg}"
}
convert_datatype => {
pid => "int"
}
}
}
output { stdout {}}
%{ts} %{+ts} %{+ts} %{src} %{} %{prog}[%{pid}]: %{msg}
hello world hello shark 123 logs [456]: hellohello
hello world hello shark 123 logs [456]: hellohello
{
"host" => "es03",
"@timestamp" => 2021-06-07T14:40:40.010Z,
"message" => "hello world hello shark 123 logs [456]: hellohello",
"src" => "shark",
"pid" => 456,
"@version" => "1",
"prog" => "logs ",
"ts" => "hello world hello",
"msg" => "hellohello"
}
前缀修饰符
- 追加
%{+some_field}
表示把匹配到的内容追加到前一个字段中
%{+some_field/2}
表示带序号的追加,2
表示追加到第二个位置
示例:
1 对于文本 1 2 3 go
, 这个 %{+a/2} %{+a/1} %{+a/4} %{+a/3}
将构建一个 a => 2 1 go 3
的键值。
2 对于文本 1 2 3 go
, 这个 %{a} %{b} %{+a}
将构建两个键值对: a => 1 3 go, b => 2
- 跳过
%{}
是一个空的跳过字段。
%{?foo}
是一个命名的跳过字段,就是把匹配到的内容先存到字段 foo 中,但是不会出现在事件中,这种情况是让后面的某些模式使用其匹配到的值的(下面 间接字段 中有示例)。
- 间接字段
%{&some_field}
表示这个字段的看 key 来自于 some_field
字段的值。
示例:
对于字符串: error: some_error, some_description
这个表达式 error: %{?err}, %{&err}
将会构建一个这样的键值对: some_error => some_description