【发布时间】:2017-12-10 17:44:30
【问题描述】:
我一直在尝试设置一个自定义的多行日志解析器,以将带有一些可读字段的日志导入 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 日志显示 Worker 启动并解析了所有内容,但 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)会显示在列表中标签。只是结果是空的。
【问题讨论】:
标签: fluentd stackdriver google-cloud-stackdriver