我一直在尝试设置一个自定义的多行日志解析器,以将带有一些可读字段的日志输入 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 控制台中根本没有显示日志。
timestart
timeend
看起来像或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
)显示在标签列表中。只是结果是空的。