Ruby 在Fluentd中解析包含JSON的日志
我正在使用Fluentd跟踪k8s中的容器日志。我使用Ruby 在Fluentd中解析包含JSON的日志,ruby,kubernetes,fluentd,Ruby,Kubernetes,Fluentd,我正在使用Fluentd跟踪k8s中的容器日志。我使用in_tailinput插件跟踪容器日志,使用regexpparse插件解析相关日志。日志是一个json,必须提取并发送到输出插件。我使用filter\u解析器插件使用json解析器进行提取 <source> @type tail tag proxy.* ... read_from_head true <parse> @type rege
in_tail
input插件跟踪容器日志,使用regexp
parse插件解析相关日志。日志是一个json,必须提取并发送到输出插件。我使用filter\u解析器
插件使用json
解析器进行提取
<source>
@type tail
tag proxy.*
...
read_from_head true
<parse>
@type regexp
expression \[proxy\]\[(?<type>(record|replay))\](?<log>.*)
</parse>
</source>
<filter proxy.**>
@type parser
key_name log
<parse>
@type json
</parse>
</filter>
这似乎产生了如下记录:
record={"type"=>"record", "log"=>"{\\\"test\\\":123}"}
当使用配置运行安装程序时,看起来好像正在转义log
regex组中的值(两次?);因此,筛选器部分中的json解析器无法对其进行解析
我怀疑这与如何编写regexp
插件和/或in_tail
有关。它可能是将日志
值选取为字符串,并在传递之前对其进行转义
还是我的正则表达式遗漏了什么
有人知道为什么会发生这种情况以及解决方案是什么吗 此问题已报告,它将在将来发布固定版本。@DaeinPark似乎是针对FluentBit而不是Fluentd的问题。您粘贴的输出在使用
regexp
解析source
后看起来像是内部记录,它仍然没有通过过滤器。一旦它通过了上面的过滤器
,它应该解析日志
字段以更正lyas json。我刚刚用finalmatch
tostdout
测试了上面的配置,它很好地打印了json。在过滤器
之后,您的最终匹配
是什么?您认为它失败的原因是什么?是的,这是源代码
解析后的记录。筛选器似乎给出了一个错误dump错误事件:error\u class=Fluent::Plugin::Parser::ParserError=“模式与数据不匹配”{\\\\“test\\\”:123}\\n\,“stream\”:\“stderr\”,“time\”:\“2019-08-27T11:14:15.23908372Z\”
“。至于match
部分,它使用fluent plugin out http
进行http调用。我不认为这有什么问题。已经报告了这个问题,它将在将来发布固定版本。@DaeinPark看起来这个问题是针对FluentBit而不是Fluentd的。您粘贴的输出在使用regexp
解析source
后看起来像内部记录,它仍然没有通过您的过滤器。一旦它通过了上面的过滤器
,它应该解析日志
字段以更正lyas json。我刚刚用finalmatch
tostdout
测试了上面的配置,它很好地打印了json。在过滤器
之后,您的最终匹配
是什么?您认为它失败的原因是什么?是的,这是源代码
解析后的记录。筛选器似乎给出了一个错误dump错误事件:error\u class=Fluent::Plugin::Parser::ParserError=“模式与数据不匹配”{\\\\“test\\\”:123}\\n\,“stream\”:\“stderr\”,“time\”:\“2019-08-27T11:14:15.23908372Z\”
“。至于match
部分,它使用fluent plugin out http
进行http调用。我不认为这有什么问题。
record={"type"=>"record", "log"=>"{\\\"test\\\":123}"}