如果 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,returns 为空,我需要它打印 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"]

如果日志字段包含特定字符串,我需要创建一个新字段 'status'。我在 fluentd 中尝试了以下代码,但这不起作用。我需要检查日志字段是否包含字符串 'error:' 那么新字段状态应该有错误,否则如果它没有问题它应该没有问题。

<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"