0

我一直在尝试设置一个自定义的多行日志解析器,以将带有一些可读字段的日志输入 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上的规范完成,并且可以正常工作。但它没有适当的时间戳就可以工作 -timestart并且timeend只是 json 中的简单字段。所以在这个当前状态下,time_format设置是没有用的,因为我在正则表达式中没有time变量。这确实聚合了我需要的所有变量,当我运行流利的服务时,日志会显示在 Stackdriver 中,并且一切都非常愉快。

但是,当我将其中一个时间变量的名称更改为 时time,尝试将 Stackdriver 时间戳实际分配给条目时,它不起作用。机器上的 fluentd 日志显示工作人员已启动并解析了所有内容,但 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)显示在标签列表中。只是结果是空的。

4

1 回答 1

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>

应该管用...

于 2017-07-13T00:09:46.717 回答