【问题标题】:Print a complete line if the regex pattern in fluentd is not matching如果 fluentd 中的正则表达式模式不匹配,则打印一个完整的行
【发布时间】:2021-04-01 10:22:28
【问题描述】:

我需要打印与特定模式匹配的消息的一部分。在某些情况下,消息没有那种模式;在那种情况下,我需要显示整行。例如,MESSAGE 字段中的值可以是两者中的任何一个:

案例一: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 &lt;checked [abc]&gt; 但对于案例 2 返回空,我需要它打印 No Message was found。即使条件不满足,我如何打印消息。 谢谢

【问题讨论】:

  • 试试:MESSAGE ${ v = record['MESSAGE'].scan(/:\ (.*+)$/).first; !(v.nil? || v.empty?) ? v : 'No message was found' }
  • 我们可以用正则表达式替换“未找到消息”,以便不依赖字符串
  • 另一种选择,假设第一部分在不匹配的情况下为nilMESSAGE ${ record['MESSAGE'].scan(/:\ (.*+)$/).first || 'No message was found' }。我不确定正则表达式。

标签: ruby fluentd


【解决方案1】:

你可以这样做:

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

【讨论】:

  • 但这会导致整行 2021-03-31 12:12:05.856 LOG : Message 但在这种情况下,我只需要冒号之后的部分,即 Message 而在没有冒号的情况下,它应该打印整行
  • 你试过了吗?它应该做你想做的事
  • 对不起,我还有另一个关于 fluentd 中的正则表达式的问题。我需要匹配另一个模式,例如:2021-03-31 12:12:05.856 LOG [Test] a.b.c.c.myclass : Message 我需要提取我尝试使用正则表达式的 a.b.c.c.myclass ([a-zA -Z]+(\.[a-zA-Z0-9]+)+)\ +:但这会导致 2 个匹配组:1。 a.b.c.c.myclass 2. .myclass 当我尝试 scan(/([a-zA-Z]+(\.[a-zA-Z0-9]+)+)\ +:/) .first 它仍然列出了用逗号分隔的两个匹配项,其中我只想要第一个
  • 只使用非捕获组:([a-zA-Z]+(?:\.[a-zA-Z0-9]+)+)\ +:
  • 我还有一个查询,因为它与相同的配置有关,我不确定我是否需要作为一个新问题提出。是否可以为过滤器中的字段指定数据类型,例如 LOGGINGTIME ${record["MESSAGE"].scan(/\d+-\d+-\d+\ \d+:\d+:\d+\.\d+/).last} 我不能要在 Elastic 搜索中对该字段进行排序,因为它显示“未知字段”,我可以将日期类型分配给该字段以进行记录。
【解决方案2】:

如果日志字段包含特定字符串,我需要创建一个新字段“状态”。我在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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 2015-02-24
    相关资源
    最近更新 更多