【问题标题】:How to change the severity level (INFO, ERROR, WARNING, etc.) of log message in Fluentd based on some keyword in the log payload?如何根据日志有效负载中的某些关键字更改 Fluentd 中日志消息的严重级别(INFO、ERROR、WARNING 等)?
【发布时间】:2018-03-28 17:35:24
【问题描述】:

我真的希望有人能帮我解决这个问题,因为我已经尝试了好几天了。

我有容器在 GKE 的 kubernetes 中运行。在 /var/log/containers/my_container.log 中,我有这样的东西(在其他一些不同格式的日志中):

{"log":"17-Oct-2017;04:36:29.744 : [main] [server:] [id:] [yt:] ERROR no.myproject.service.Server - call failed for some reason\n","stream":"stdout","time":"2017-10-17T04:36:29.750702216Z"}

此日志在 Stackdriver(GKE 中的 Fluentd 输出)上显示为 INFO 日志,类似于:

23:02:32.000 17-Oct-2017;04:36:29.744 : [main] [server:] [id:] [yt:] ERROR no.myproject.service.Server - call failed for some reason

所以

23:02:32.000 

被添加到它(这是 Stackdriver 的正常行为)。我将这种格式称为格式 2。

由于此日志消息实际上是一条 ERROR 日志消息(基于其有效负载内容),我希望它在 Stackdriver (Fluentd) 中显示为 ERROR。

我正在尝试:

<filter reform.**>
  type parser
  format /^(?<time>\d{2} [^\s]*) : (?<message2>[^ \]]*)\] (?<message3>[^ \]]*)\] (?<message4>[^ \]]*)\] (?<message5>[^ \]]*)\] (?<severity>\w)\s+(?<log2222>.*)/
  reserve_data true
  suppress_parse_error_log false
  key_name log
</filter>

希望将消息的严重性更改为 ERROR,并将日志中 [..] 字段的内容作为一些新的键/值(在本例中为 message2: main 等)。

但是将这个过滤器添加到我的配置文件后,输出日志仍然和以前一样,我没有看到任何变化。

我错过了什么?当我写我的正则表达式模式时,我不确定我是否真的应该考虑 kubernetes 日志文件中消息的“日志”字段或我称之为格式 2 的那个(添加了时间 - 在 Stackdriver 上) .

非常感谢任何建议,这将是一个很大的帮助。

【问题讨论】:

    标签: regex logging kubernetes fluentd google-kubernetes-engine


    【解决方案1】:

    我不知道您使用的工具,但您的正则表达式的第一部分似乎与日志字符串中前缀时间的确切格式不匹配。

    其实\d{2}只会匹配2位数字。

    要匹配整个时间前缀,您可以改用(?:\d{2}:){2}\d{2}\.\d{3}

    关于严重性的另外一点:你写了(?&lt;severity&gt;\w),它只捕获了一个单词字符。您可以使用(?&lt;severity&gt;\w+) 来匹配多个字符。

    你的正则表达式会变成:

    ^(?<time>(?:\d{2}:){2}\d{2}\.\d{3} [^\s]*) : (?<message2>[^ \]]*)\] (?<message3>[^ \]]*)\] (?<message4>[^ \]]*)\] (?<message5>[^ \]]*)\] (?<severity>\w+)\s+(?<log2222>.*)
    

    demo 匹配。

    【讨论】:

    • 非常感谢。现在我正在从输出中的有效负载中捕获严重性。我还有一个问题。我还期望在输出中添加 message2 到 message 5 和 log2222 的新字段,但不会添加新字段。如何从日志文本有效负载中提取一些数据并将其作为输出中的新额外字段(如上例中的“message2:[main]”)?
    • 不客气。我不知道你的工具,所以我不确定它是否会有所帮助,但是,如果你可以指定替换字符串,你可以使用 ${severity} message2: ${message2} 作为替换。然后你会得到ERROR message2: [main。查看新版本here
    猜你喜欢
    • 2013-01-28
    • 2016-02-20
    • 1970-01-01
    • 2020-01-09
    • 2015-06-16
    • 2011-03-09
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    相关资源
    最近更新 更多