2017-10-17 57 views
0

我真的很希望有人能帮我解决这个问题,因为我一直试图弄清楚这几天。如何根据日志有效载荷中的某个关键字更改Fluentd中的日志消息的严重级别(INFO,ERROR,WARNING等)?

我有容器在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> 

希望得到的消息变化的严重程度错误,并且也得到[..]字段的日志一些新的键/值的内容(在此case message2:main等)。

但是,在将此过滤器添加到我的配置文件后,输出日志仍然和以前一样,并且我没有看到任何更改。

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

我真的很感激任何建议,这将是一个很大的帮助。

回答

0

我不知道你正在使用的工具,但它看起来像你的正则表达式的第一部分不匹配你的日志字符串中的前缀时间的确切格式。

其实\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鞋匹配。

+0

非常感谢。现在我正在捕获输出中有效负载的严重性。我还有一个问题。我还希望在输出中添加message2到message 5和log2222的新字段,但不会添加新字段。我如何从日志文本有效载荷中提取一些数据,并将其作为输出中的新外部字段(如上例中的“message2:[main]”)? – samanta

+0

不客气。我不知道你的工具,所以我不确定它会有帮助,但是,如果你可以指定替换字符串,那么你可以使用'$ {severity} message2:$ {message2}'作为替换。然后你会得到'ERROR message2:[main'。查看新版本[这里](https://regex101.com/r/o5lu2j/2)。 – PJProudhon

相关问题