Журналы JSON в Google Cloud Logging с использованием Winston в nodeJS

Я запускаю сервер nodeJS на Ubuntu 14.04 в Google Compute Engine. Я хочу использовать облачное ведение журнала Google для своего приложения, поэтому я установил агент ведения журнала google fluentd в соответствии с https://cloud.google.com/logging/docs/agent/installation

Я использовал winston и winston-syslog для записи логов. Вот код.

var winston = require('winston');
var winstonsyslog = require('winston-syslog').Syslog;

var options = {
    json : true
};

winston.add(winston.transports.Syslog, options);

Когда я пишу журнал, используя

winston.log('info', "27", { anything: 'This is metadata' });

я получаю

{
  metadata: {…}    
  textPayload: "May 14 10:47:44 localhost node[7633]: {"anything":"This is metadata","level":"info","message":"27"}"    
  insertId: "..."    
  log: "syslog.local0.info"    
}

Как получить structPayload вместо textPayload, которая отображает журнал как JSON вместо String.


person tacticurv    schedule 14.05.2016    source источник
comment
У меня такая же проблема ... В конце концов я сдался ... docs заявляют, что вы должны называть свои журналы суффиксом .log.json и что у вас должен быть встроенный действительный объект JSON в каждой строке ... хотя даже с этим мне не удалось прочитать его через облачный журнал Googles ... К вашему сведению: Ваш журнал, как и в testPayload, не является объектом JSON   -  person farridav    schedule 18.05.2016
comment
Сейчас я использую клиент gcloud nodeJS для входа в службу облачного ведения журнала Google. Как-то это работает googlecloudplatform.github.io/gcloud-node /#/docs/v0.34.0/   -  person tacticurv    schedule 19.05.2016
comment
Я думаю, это потому, что он подключается к Googles, лежащему в основе форка fluentd ... Мне удалось заставить журналы работать, имитируя тот же формат, что и здесь .. хотя я думаю, что правильный способ сделать это - использовать агент регистрации   -  person farridav    schedule 19.05.2016


Ответы (1)


Агент ведения журнала имеет собственные файлы конфигурации, и в большинстве из них есть format none (см. https://github.com/GoogleCloudPlatform/fluentd-catch-all-config). Таким образом, все строки журнала переходят в textPayload.

Решение состоит в том, чтобы написать собственный файл конфигурации fluentd и использовать fluent-plugin-google-cloud как вывод. fluent-plugin-google-cloud должен быть установлен как гем напрямую, без использования агента ведения журнала. Пока ваша запись является допустимым JSON, вы увидите, что эта запись в Stackdriver structPayload настроена правильно. Фильтры "ключ-значение" также работают.

Я никогда не использовал Winston, но вот пример конфигурации:

<source>
    @type tail
    format apache
    path /var/log/apache/access.log
    tag apache.access
</source>

<match **>
    @type google_cloud
    buffer_chunk_limit 10k
</match>

Обратите внимание на buffer_chunk_limit 10k, установка слишком больших значений или оставление значения по умолчанию может привести к Google::Apis::ClientError badRequest: Request payload size exceeds the limit.

person prog893    schedule 09.09.2016