2017-07-06 36 views
0

我一直在试图设置一个自定义的多行日志解析器来获取带有一些可读字段的Stackdriver日志。目前,它看起来像这样:Stackdriver自定义多行日志记录,时间格式

<source> 
    type tail 
    read_from_head true 
    path /root/ansible.log 
    pos_file /var/lib/google-fluentd/pos/ansible.pos 
    time_format "%a %b %e %T %Z %Y" 
    format multiline 
    format_firstline /Started ansible run at/ 
    format1 /Started ansible run at (?<timestart>[^\n]+)\n(?<body>.*)/ 
    format2 /PLAY RECAP.*/ 
    format3 /ok=(?<ok>\d+)\s+changed=(?<changed>\d+)\s+unreachable=(?<unreachable>\d+)\s+failed=(?<failed>\d+).*/ 
    format4 /Finished ansible run at (?<timeend>[^\n]+)/ 
    tag ansible 
</source> 

它的完成的规格为http://docs.fluentd.org/v0.12/articles/parser_multiline,和它的作品。但它没有适当的时间戳 - timestarttimeend只是json中的简单字段。所以在当前状态下,time_format设置是无用的,因为我在正则表达式中没有time变量。这样可以汇总我所需要的所有变量,当我运行fluend服务时,日志会显示在Stackdriver中,而且几乎都很快乐。

但是,当我将其中一个时间变量的名称更改为time时,试图为条目实际分配一个Stackdriver时间戳,它不起作用。机器上流利的日志表示工作人员启动并解析了所有内容,但根本没有在Stackdriver控制台中显示日志。

timestarttimeend看起来像Fri Jun 2 20:39:58 UTC 2017或沿着这些线。时间格式的规格是http://ruby-doc.org/stdlib-2.4.1/libdoc/time/rdoc/Time.html#method-c-strptime,我已经检查过并重复检查了太多次,我无法弄清楚我做错了什么。

编辑:另一个细节:当我试图解析出time变量,而日志没有在为Stackdriver控制台显示,选择合适的标签(在这种情况下ansible)在标签列表中显示。只是结果是空的。

回答

0

你是正确的,因为为Stackdriver日志代理查找在'time'领域的时间戳,但它使用Ruby的Time.iso8601来解析该值(误差在Time.at回落)。您引用的字符串(Fri Jun 2 20:39:58 UTC 2017)不是这两种格式中的任何一种,因此无法解析它(您可能会在/var/log/google-fluentd/google-fluentd.log中看到错误)。 您可以将record_transformer插件添加到您的配置中,将解析日期更改为正确的格式(提示:enable_ruby是您的朋友)。喜欢的东西:

<filter foo.bar> 
    @type record_transformer 
    enable_ruby 
    <record> 
    time ${Time.strptime(record['time'], '%a %b %d %T %Z %Y').iso8601} 
    </record> 
</filter> 

应该工作...

+0

除,正如我所说,我没有看到在fluentd日志中的任何错误,fluentd日志说一切正常,它只是日志唐不会出现在Stackdriver中。至于时间格式,我已经尝试在上面的块中使用'%a%b%e%T%Z%Y',所以我只是想知道为什么我的方法不工作。 – snetch