我真的希望有人会帮我解决这个问题,因为我一直试图解决这个问题。
我在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等)。
但是在将此过滤器添加到我的配置文件后,输出日志仍然像以前一样,我没有看到任何变化。
我错过了什么?当我写我的正则表达式模式时,我不确定我是否真的应该考虑&#34; log&#34; kubernetes中日志文件中的消息字段或我调用格式2的消息字段(添加时间 - 在Stackdriver上)。
我真的很感激任何建议,这将是一个很大的帮助。
答案 0 :(得分: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匹配。