Я пытался настроить пользовательский парсер многострочного журнала, чтобы получать журналы в 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, когда я запускаю службу fluend, и все почти устраивает.
Однако, когда я меняю имя одной из этих временных переменных на 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
) отображается в списке тегов. Просто результаты пустые.