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