[英]Print a complete line if the regex pattern in fluentd is not matching
我需要打印與特定模式匹配的消息的一部分。 在某些情況下,消息沒有那種模式; 在那種情況下,我需要顯示整行。 例如,MESSAGE 字段中的值可以是以下兩者中的任何一個:
案例 1: 2021-03-31 12:12:05.856 LOG: Message <checked [abc]>
案例2: No Message was found
流利的過濾器是:
<filter docker>
@type record_transformer
enable_ruby true
<record>
MESSAGE ${record["MESSAGE"].scan(/:\ (.*+)$/).first}
</record>
</filter>
過濾器適用於案例 1。它打印Message <checked [abc]>
但對於案例 2 返回空,其中我需要它打印No Message was found
。 即使條件不滿足,我如何打印消息。 謝謝
你可以這樣做:
MESSAGE ${record["MESSAGE"].scan(/^.+: (.+)$|^(.*)$/).first.compact}
編輯:
當前面的部分不匹配時,正則表達式的最后一部分(在您的情況下為后半部分)將捕獲該行。 這是正則表達式中的常用技術; 有些人可能會稱之為“垃圾收集”?
當我介紹了第二個捕獲組時,您將獲得一個包含兩個組的數組。 如果一個組沒有捕獲任何東西,那么它的值將是nil
。 這就是為什么你可以調用compact
來擺脫nil
捕獲; 這會將數組減少到只有一個元素。
regexp = /^.+: (.+)$|^(.*)$/
'2021-03-31 12:12:05.856 LOG : Message <checked [abc]>'.scan(regexp).first.compact
# => ["Message <checked [abc]>"]
'No Message was found'.scan(regexp).first.compact
# => ["No Message was found"]
如果日志字段包含特定字符串,我需要創建一個新字段“狀態”。 我在fluentd中嘗試了下面的代碼,但這不起作用。 我需要檢查日志字段是否包含字符串“錯誤:”,然后新字段狀態應該有錯誤,否則如果它沒問題,它應該沒問題。
<filter **>
@type record_transformer
enable_ruby true
<record>
status ${record["log"].scan(/^.* ([[:<:]]error[[:>:]]|[[:<:]]ok[[:>:]]):.*$/i).first.compact}
</record>
</filter>
我得到的錯誤是 error = undefined method `compact' for nil:NilClass"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.