Docker & gcplogs: сообщение как json - PullRequest
0 голосов
/ 07 ноября 2018

Я запускаю проект, развернутый с docker-compose, используя gcplogs драйвер. Интересно, возможно ли преобразовать строку сообщения, написанную в stdout, в сложную полезную нагрузку JSON.

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

{
  "container": {…}   
  "instance": {…}   
  "message":  "service:php type:NOTICE message:\"The message I want to log\""   
 }

Я попытался отформатировать сообщение как JSON, но в результате получилось свойство сообщения, содержащее строковый JSON:

{
  "container": {…}   
  "instance": {…}   
  "message":  "{\"service\":\"php\",\"type\":\"NOTICE\",\"message\":\"The message I want to log\"}"
 }

Есть ли в docker-compose какая-либо конфигурация для автоматического анализа строки сообщения как полезной нагрузки JSON? Как опция --payload-type=json при использовании gcloud с CLI? Возможно это возможно с fluentd драйвером, но правильно ли он обрабатывается gcp?

Спасибо, ребята!

1 Ответ

0 голосов
/ 18 мая 2019

Вы можете использовать версию Google fluentd , которая уже предварительно настроена для работы со Stackdriver (например, он автоматически обнаруживает учетные данные при запуске из виртуальной машины GCP).

  1. Установите google-fluentd прямо на виртуальную машину (вне Docker)

    $ curl -sSO https://dl.google.com/cloudagents/install-logging-agent.sh
    $ sudo bash install-logging-agent.sh
    
  2. Вы можете удалить всю стандартную конфигурацию шаблона из файла конфигурации fluentd (etc/google-fluentd/google-fluentd.conf в Ubuntu) и просто добавить конфигурацию для вашей конкретной службы (при условии, что вам больше не нужно использовать google-fluentd) , Для этого удалите все до раздела, начинающегося с <match **> и вставьте вместо него следующую конфигурацию:

    <source>
      @type forward
      port 24225
      bind 127.0.0.1
    </source>
    
    <filter **>
      @type add_insert_ids
    </filter>
    
    <filter **>
      @type parser
      key_name message
      <parse>
        @type json
      </parse>
    </filter>
    
  3. Обновить Fluentd:

    $ sudo sudo systemctl reload google-fluentd

  4. Установите fluentd как драйвер ведения журнала с назначением localhost:24225 для контейнера приложения или просто измените драйвер ведения журнала по умолчанию для всего Docker Engine в /etc/docker/daemon.json :

    {
      "log-driver": "fluentd",
      "log-opts": {
        "fluentd-address": "localhost:24225"
      }
    }
    

    и перезагрузите Docker:

    $ sudo systemctl reload docker

С этого момента вы должны видеть, что журналы вашего приложения хорошо анализируются в программе просмотра журналов Stackdriver. Если вы этого не сделаете, проверьте журнал fluentd (/var/log/google-fluentd/google-fluentd.log в Ubuntu) на возможные проблемы с синтаксическим анализом JSON.

...