2017-10-17 98 views
0

我真的很希望有人能幫我解決這個問題,因爲我一直試圖弄清楚這幾天。如何根據日誌有效載荷中的某個關鍵字更改Fluentd中的日誌消息的嚴重級別(INFO,ERROR,WARNING等)?

我有容器在GKE中運行kubernetes。在/var/log/containers/my_container.log,我有這樣的事情(不同格式的一些其他日誌中):

{"log":"17-Oct-2017;04:36:29.744 : [main] [server:] [id:] [yt:] ERROR no.myproject.service.Server - call failed for some reason\n","stream":"stdout","time":"2017-10-17T04:36:29.750702216Z"} 

此日誌出現在爲Stackdriver(在GKE Fluentd輸出)作爲INFO日誌和像:

23:02:32.000 17-Oct-2017;04:36:29.744 : [main] [server:] [id:] [yt:] ERROR no.myproject.service.Server - call failed for some reason 

所以

23:02:32.000 

被添加到它(這是爲Stackdriver的正常行爲)。我將這種格式稱爲格式2.

由於此日誌消息實際上是一個ERROR日誌消息(基於其有效負載內容),我希望它在Stackdriver(Fluentd)中顯示爲ERROR。

我想:

<filter reform.**> 
    type parser 
    format /^(?<time>\d{2} [^\s]*) : (?<message2>[^ \]]*)\] (?<message3>[^ \]]*)\] (?<message4>[^ \]]*)\] (?<message5>[^ \]]*)\] (?<severity>\w)\s+(?<log2222>.*)/ 
    reserve_data true 
    suppress_parse_error_log false 
    key_name log 
</filter> 

希望得到的消息變化的嚴重程度錯誤,並且也得到[..]字段的日誌一些新的鍵/值的內容(在此case message2:main等)。

但是,在將此過濾器添加到我的配置文件後,輸出日誌仍然和以前一樣,並且我沒有看到任何更改。

我錯過了什麼?當我寫我的正則表達式模式時,我不確定是否應該在kubernetes的日誌文件中考慮消息的「日誌」字段,或者我將其稱爲格式2的消息的日誌文件字段(添加時間 - 在Stackdriver上) 。

我真的很感激任何建議,這將是一個很大的幫助。

回答

0

我不知道你正在使用的工具,但它看起來像你的正則表達式的第一部分不匹配你的日誌字符串中的前綴時間的確切格式。

其實\d{2}只能匹配2位數。

要匹配整個時間前綴,您可以使用(?:\d{2}:){2}\d{2}\.\d{3}來代替。

關於嚴重性還有一點:你寫了(?<severity>\w),它只捕獲一個單詞字符。您可以使用(?<severity>\w+)來匹配多個字符。然後

你的正則表達式將變爲:

^(?<time>(?:\d{2}:){2}\d{2}\.\d{3} [^\s]*) : (?<message2>[^ \]]*)\] (?<message3>[^ \]]*)\] (?<message4>[^ \]]*)\] (?<message5>[^ \]]*)\] (?<severity>\w+)\s+(?<log2222>.*) 

demo鞋匹配。

+0

非常感謝。現在我正在捕獲輸出中有效負載的嚴重性。我還有一個問題。我還希望在輸出中添加message2到message 5和log2222的新字段,但不會添加新字段。我如何從日誌文本有效載荷中提取一些數據,並將其作爲輸出中的新外部字段(如上例中的「message2:[main]」)? – samanta

+0

不客氣。我不知道你的工具,所以我不確定它會有幫助,但是,如果你可以指定替換字符串,那麼你可以使用'$ {severity} message2:$ {message2}'作爲替換。然後你會得到'ERROR message2:[main'。查看新版本[這裏](https://regex101.com/r/o5lu2j/2)。 – PJProudhon

相關問題