我一直在尝试设置自定义多行日志解析器,以使用一些可读字段将日志导入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
变量。这会聚合我需要的所有变量,当我运行fluend服务时,日志会显示在Stackdriver中,而且一切都快乐。
但是,当我将其中一个时间变量的名称更改为time
时,尝试实际为该条目分配Stackdriver时间戳,它不起作用。机器上流畅的日志说工作人员启动并解析了所有内容,但日志根本没有显示在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
)显示在标签列表中。只是结果是空的。
答案 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>
应该有用......