如何根据日志有效负载中的某些关键字更改 Fluentd 中日志消息的严重级别(信息、错误、警告等)?

How to change the severity level (INFO, ERROR, WARNING, etc.) of log message in Fluentd based on some keyword in the log payload?

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

我在 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"}

此日志作为 INFO 日志出现在 Stackdriver(GKE 中的 Fluentd 输出)上:

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。

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

我正在尝试:

<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,并将日志中 [..] 字段的内容作为一些新的 key/values(在本例中为 message2:main 等)。

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

我错过了什么?当我写我的 Regex 模式时,我不确定我是否真的应该考虑 kubernetes 日志文件中消息的 "log" 字段或我称为格式 2 的字段(添加时间 - on Stackdriver).

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

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

实际上\d{2}只会匹配2个数字。

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

关于严重性的补充一点:您写的 (?<severity>\w) 只捕获一个单词字符。您可以使用 (?<severity>\w+) 来匹配多个字符。

您的正则表达式将变为:

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

那个 demo 鞋子是火柴。