繁体   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