2016-11-22 24 views
2

配置Logstash時,add_fieldreplace之間有什麼區別?add_field和replace之間的Logstash區別

從語義上講,他們可能會做不同的事情,但current manual沒有什麼可說的關於這兩種功能如何根據相關領域的預先存在而不同。

例1:

filter { 
    mutate { 
    add_field => { "foo_%{somefield}" => "Hello world, from %{host}" } 
    } 
} 

本手冊不說,預計水煤漿是什麼,如果該領域已經存在。行爲是否與replace相同?

例2:

filter { 
    mutate { 
    replace => { "message" => "%{source_host}: My new message" } 
    } 
} 

再次手冊沒有說預期的行爲是什麼,如果該字段不存在。是否與add_field相同?

+0

你試過了嗎? –

+0

簡而言之,在我的場景中,它看起來像add_field正在附加值。我問這個問題,因爲我希望得到更多關於預期行爲的官方/文件記錄答案。 –

回答

4

語義上講,它們似乎是等價的,但它們是不同的,因爲add_field可能並不總是一命嗚呼

replacemutate過濾器的一部分,如果你是looking at the source code of that plugin,你會看到替換將總是設置一個域,即使它不存在:

def replace(event) 
    @replace.each do |field, newvalue| 
     event.set(field, event.sprintf(newvalue)) 
    end 
    end 

add_field,然而,任何輸入和過濾插件的通用配置,你會經常出現一些特殊的文檔中看到過濾器插件是這樣的(例如對於grok過濾器):

如果此過濾器成功,請將任何任意字段添加到此事件。 [...]

該配置從LogStash::Filters::Base繼承,它是所有過濾器插件的超類。這意味着在某些過濾器插件中,爲了使add_field實際添加字段,過濾器必須成功,否則不會添加任何字段。

所以在你的情況下,mutate/replace將總是設置一個字段,即使它不存在,並且mutate/add_field將在運行mutate過濾器的所有操作之後添加指定的字段。

因此,如果您有一個mutate過濾器執行某些特定操作(如gsub),並且由於某種原因失敗,則不會添加任何字段作爲結果。

相關問題