簡體   English   中英

如果 fluentd 中的正則表達式模式不匹配,則打印一個完整的行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM