Logstash的多行输入以及自定义Pattern

  1. 1. 前言
  2. 2. 接受以多行为单位输入的Log
  3. 3. 自定义grok的pattern
  4. 4. 省略grok解析出的一些field
  5. 5. 感想

前言

通常我们仅仅用logstash处理access log。这个时候logstash的配置如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
input {
stdin {}
}

filter {
grok {
match => { "message" => "%{HTTPD_COMMONLOG}" }
}
}

output {
stdout { codec => rubydebug }
}

我们知道,logstash的config内容分为input,filter和output三个部分。
这三个部分都集成了很多插件。我们可以从不同的地方进行input,通过filter对data进行整理,然后output。

在实际问题中,我遇到几个问题。

  • log的单位并不是一行,而是多行。

  • 我可以自定义match的pattern吗?

  • grok的match里面的message能省略掉吗?

接受以多行为单位输入的Log

我们知道,apache access log 和 nginx access log 以及大多数log都是以单行为单位输出的。

比如

1
[Fri Sep 09 10:42:29.902022 2011] [core:error] [pid 35708:tid 4328636416] [client 72.15.99.187] File does not exist: /usr/local/apache2/htdocs/favicon.ico

input的大多数插件默认是接受单行单位log输入。我们可以用multiline这个codec plugin 来接受多行输入。

1
2
3
4
5
6
7
8
input {
stdin {
codec => multiline {
pattern => "^\s"
what => "previous"
}
}
}

上面的配置的意思是,当以空格开头的行,我们把它和上面一行归并到一个log中。具体的其他用法可以查看multiline plugin的文档。

自定义grok的pattern

grok里面的match的message,其实是定义在这里的各种pattern。
我们可以自定义pattern。

形式如下

1
2
3
4
5
USERNAME [a-zA-Z0-9._-]+
USER %{USERNAME}
EMAILLOCALPART [a-zA-Z][a-zA-Z0-9_.+-=:]+
EMAILADDRESS %{EMAILLOCALPART}@%{HOSTNAME}
INT (?:[+-]?(?:[0-9]+))

将这些pattern保存在文件中,然后在logstash的config中制定读取pattern的目录即可。

1
2
3
4
5
6
filter {
grok {
patterns_dir => ["/usr/local/logstash/patterns"]
match => { "message" => "%{USER: user} %{INT: age} %{EMAILADDRESS: email}"}
}
}

这样,我们输出的时候可以获得到message,user,age,email这几个field。

省略grok解析出的一些field

可以用mutate这个plugin来移除一些field。

1
2
3
mutate {
remove_field => [ "message" ]
}

这样output的结果中就不会有message这个field了。

感想

logstash提供了丰富的插件。在遇到问题的时候除了善于搜索还要有耐心阅读插件文档,必要时候需要写demo进行测试。

如果你觉得本文对你有帮助,请给我点赞助。