如果 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"
我需要打印与特定模式匹配的消息的一部分。在某些情况下,消息没有那种模式;在那种情况下,我需要显示整行。例如,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"