2017-02-17 26 views
0

後的情況:Logstash:如果基於跌落在事件拆分

我輸入日誌是這個樣子:

{ 
"key1":"value1" 
"key2":"value2" 
"events": 
[{ 
"Level":"Information", 
"Code":"100" 
}, 
{ 
"Level":"Information", 
"SomeKey":"SomeValue" 
}, 
{ 
"Level":"Error", 
"Message":"Something went wrong" 
} 
]} 

我想:

  1. 拆分events數組以創建單個對象,其中所有外層字段仍填充(key1和key2)。

  2. 拆分後選擇性地刪除日誌。如果它們包含「代碼」屬性,我只想保留「信息級別」日誌。

我logstash配置看起來像

filter { 
split { 
    field => "[events]" 
    } 
} 

filter { 
    if ![events][Code] 
    { drop {} } 
} 

output { 
    elasticsearch {} 
} 

問題:似乎

Logstash不執行第二過濾器之前的事件分開。換句話說,如果日誌中的任何事件沒有「代碼」字段,則整個日誌將被刪除,包括我必須保留的「錯誤」級別信息。

我已經在這裏待了大概一整天,它真的讓我很緊張。我會手動嘗試創建自己的插件,但我從來沒有使用任何Ruby。

我非常確定這並不重要,但我在Docker中運行ELK堆棧。我相信這些配置文件可以正確加載,並且可以被Logstash使用。

回答

0

這實際上似乎是某種logstash錯誤。下面是它是一個錯誤的示範:

配置文件:

input { 
    stdin { codec => "json" } 
} 
filter { 
    split { field => "events" } 
    if ([events] == "" or [events][Code] == "") { 
     drop {} 
    } 
} 
output { 
    stdout { codec => "rubydebug" } 
} 

命令行:

echo '{"key1":"value1","key2":"value2","events":[{"Level":"Information","Code":"100"},{"Level":"Information","SomeKey":"SomeValue"},{"Level":"Error","Message":"Something went wrong"}]}' | bin/logstash -f test.conf 

結果:

Exception in thread "[main]>worker7" java.lang.NumberFormatException: For input string: "Code" 
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
    at java.lang.Integer.parseInt(Integer.java:580) 
    at java.lang.Integer.parseInt(Integer.java:615) 
    at org.logstash.Accessors.fetch(Accessors.java:130) 
    at org.logstash.Accessors.get(Accessors.java:20) 
    at org.logstash.Event.getUnconvertedField(Event.java:160) 
    at org.logstash.ext.JrubyEventExtLibrary$RubyEvent.ruby_get_field(JrubyEventExtLibrary.java:113) 
    at org.logstash.ext.JrubyEventExtLibrary$RubyEvent$INVOKER$i$1$0$ruby_get_field.call(JrubyEventExtLibrary$RubyEvent$INVOKER$i$1$0$ruby_get_field.gen) 

所以基本上仍然認爲事件是陣列,它試圖通過「代碼」對其進行索引

這似乎解決問題:

mutate { 
      add_field => ["code", "%{[events][Code]}"] 
    } 
    if ([code] == "%{[events][Code]}") { 
      drop {} 
    } 
    mutate { 
      remove_field => ["code"] 
    } 
+0

這個黑客做了這份工作,謝謝!我應該擔心黑客會在未來的更新中停止工作嗎? –

+0

這個特殊的黑客應該不會破壞新版本...它將一個字段從一個位置複製到另一個位置,然後檢查它是否爲'%{[events] [Code]}' - 這將是確切的字符串如果沒有[events] [Code],因爲logstash不會替代未設置的值。 – Alcanzar