Logstash的事件處理分為3個(gè)階段: inputs (生成事件) --> filters (修改事件) --> outputs (輸出修改后的時(shí)間到其他地方)飒赃。
因此Logstash的config file結(jié)構(gòu)如下:
input { ...}
filter { ...}
output { ...}
Logstash運(yùn)行時(shí)可以指定config文件,也可以指定config目錄(有一個(gè)或多個(gè)config文件)今妄,因此可以把所有config寫在一個(gè)文件里呛梆,也可以把config分散寫到若干個(gè)小的文件里倾芝。
那么問題來了,例如如果有多個(gè)config(多個(gè)input或多個(gè)filter),怎樣來控制它們被執(zhí)行的順序呢阻桅?
答案是Logstash是按照config file的文件名俭识,按照字母順序合并了所有的config file慨削,然后才處理的。
比如我有以下3個(gè)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最終其實(shí)按照這3個(gè)filter的名字的字母順序,即先filter_2_grep_ignore_debug, 后filter_10_grok_nova缚态, 最后filter_10_mutate_pki-token-filter磁椒,合并成了1個(gè)filter來供后續(xù)使用。
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[^\'|"]*', '*****']
}
}
因此在有多個(gè)config文件的情況下玫芦,根據(jù)你想要的執(zhí)行順序來為每個(gè)config文件命名是非常重要的浆熔。
如果使用puppet-logstash來生成config文件的話,?注意使用order屬性桥帆。這個(gè)order就是文件名中的數(shù)字医增。
例如:
logstash::configfile { 'mutate_pki_token':
content => 'filter { mutate { gsub => [\'@message\', \'MII[^\'|"]*\', \'*****\'] } } ',
order => 20,
}