Logstash的事件处理分为3个阶段: inputs (生成事件) --> filters (修改事件) --> outputs (输出修改后的时间到其他地方)。
因此Logstash的config file结构如下:
input { ...}
filter { ...}
output { ...}
Logstash运行时可以指定config文件,也可以指定config目录(有一个或多个config文件),因此可以把所有config写在一个文件里,也可以把config分散写到若干个小的文件里。
那么问题来了,例如如果有多个config(多个input或多个filter),怎样来控制它们被执行的顺序呢?
答案是Logstash是按照config file的文件名,按照字母顺序合并了所有的config file,然后才处理的。
比如我有以下3个filter:
filter_2_grep_ignore_debug
filter {
if ("[D|d]ebug|DEBUG" in [@message]){
drop { }
}
}
filter_10_grok_nova
filter {
if [type] == "nova" {
grok {
match => { "message" => ['%{NOVAWSGINEW}', '%{NOVACAPACITY}', '%{NOVAGENERAL}']}
patterns_dir => ['/etc/logstash/agent/patterns']
}
}
}
filter_10_mutate_pki-token-filter
filter {
mutate {
gsub => ['@message', 'MII[^\'|"]*', '*****']
}
}
最后Logstash最终其实按照这3个filter的名字的字母顺序,即先filter_2_grep_ignore_debug, 后filter_10_grok_nova, 最后filter_10_mutate_pki-token-filter,合并成了1个filter来供后续使用。
filter {
if ("[D|d]ebug|DEBUG" in [@message]){
drop { }
}
if [type] == "nova" {
grok {
match => { "message" => ['%{NOVAWSGINEW}', '%{NOVACAPACITY}', '%{NOVAGENERAL}']}
patterns_dir => ['/etc/logstash/agent/patterns']
}
}
mutate {
gsub => ['@message', 'MII[^\'|"]*', '*****']
}
}
因此在有多个config文件的情况下,根据你想要的执行顺序来为每个config文件命名是非常重要的。
如果使用puppet-logstash来生成config文件的话,�注意使用order属性。这个order就是文件名中的数字。
例如:
logstash::configfile { 'mutate_pki_token':
content => 'filter { mutate { gsub => [\'@message\', \'MII[^\'|"]*\', \'*****\'] } } ',
order => 20,
}
Reference
- http://logz.io/blog/5-logstash-pitfalls-and-how-to-avoid-them/