Stackdriver自定义多行日志记录,时间格式

时间:2017-07-06 15:48:57

标签: fluentd stackdriver google-cloud-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)显示在标签列表中。只是结果是空的。

1 个答案:

答案 0 :(得分:0)

您确认Stackdriver日志记录代理在'time'字段中查找时间戳,但它使用Ruby的Time.iso8601来解析该值(返回{{} 3}}出错)。您引用的字符串(Fri Jun 2 20:39:58 UTC 2017)不是这两种格式之一,因此无法解析它(您可能会在/var/log/google-fluentd/google-fluentd.log中看到错误)。 您可以在配置中添加Time.at插件,将解析日期更改为正确的格式(提示: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>

应该有用......