Logstash的config file

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

  1. http://logz.io/blog/5-logstash-pitfalls-and-how-to-avoid-them/

你可能感兴趣的:(Logstash的config file)