Назад | Перейти на главную страницу

Как заставить журналы Compute Engine оказаться в структурированном jsonPayload вместо textPayload?

Я использую API на виртуальной машине Linux в качестве вычислительного экземпляра в Google Cloud. API работает с systemd, и он входит в syslog. Я запускаю агент ведения журнала StackDriver, чтобы передать журналы в StackDriver.

С помощью этого API я записываю сообщения Json на стандартный вывод. Если я прочитаю /var/log/syslog (или сделать systemctl status), Вижу такие сообщения:

May  9 14:10:25 test-rulesapi-core-473n dotnet-example[4021]: {"customfield": "value"}

Я хотел бы добиться, чтобы полезная нагрузка Json попала в jsonPayload поле записей журнала, чтобы иметь возможность запускать пользовательские запросы. Я попытался изменить конфигурацию StackDriver таким образом, чтобы она игнорировала префикс, добавленный к сообщениям журнала (с датой, именем приложения и т. Д.), Чтобы в StackDriver отправлялся только необработанный Json. Конфигурация выглядит так (по умолчанию закомментирована):

# format /^(?<message>(?<time>[^ ]*\s*[^ ]* [^ ]*) .*)$/
format /^(?<time>[^ ]*\s*[^ ]* [^ ]*)[^{]*(?<message>.*)$/

Кажется, что это правильно извлекает только json-часть сообщения, но моя проблема в том, что в записях журнала она все еще попадает в textPayload поле.

Например, если я получаю одну конкретную запись журнала с помощью gcloud, это выглядит так:

$ gcloud logging read "logName=projects/my-project/logs/syslog AND insertId=ajooj1g318gl2l"
---
insertId: ajooj1g318gl2l
labels:
  compute.googleapis.com/resource_name: myapi-473n
logName: projects/travix-production/logs/syslog
receiveTimestamp: '2018-05-09T14:00:03.877941542Z'
resource:
  labels:
    instance_id: '3565608832621021979'
    project_id: travix-production
    zone: europe-west1-c
  type: gce_instance
textPayload: '{"customfield": "value"}'
timestamp: '2018-05-09T14:00:03Z'

Как я могу заставить StackDriver поместить объект Json в jsonPayload как подходящий объект, чтобы иметь возможность использовать пользовательские запросы?

Я вижу, что вам нужно напечатать объект Json в поле jsonPayload для ведения журнала.

Прочитав некоторые документы, я вот что думаю. Вам следует изучить синтаксический анализатор [1], также я хотел бы поделиться с вами тем, как плагин синтаксического анализа системного журнала анализирует журналы [2].


[1] https://cloud.google.com/logging/docs/structured-logging#writing_your_own_parser

[2] https://docs.fluentd.org/parser/syslog