Пользовательский многострочный журнал Stackdriver, формат времени

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


person snetch    schedule 06.07.2017    source источник


Ответы (1)


Вы правы, что агент ведения журнала 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>

должно сработать...

person Igor Peshansky    schedule 13.07.2017
comment
Кроме того, как я уже сказал, я не вижу никаких ошибок в журнале fluentd, журнал fluentd говорит, что все в порядке, просто журналы не отображаются в Stackdriver. Что касается формата времени, я уже пытаюсь использовать %a %b %e %T %Z %Y в приведенном выше блоке, поэтому мне просто интересно, почему мой метод не работает. - person snetch; 14.07.2017