Использование Express-Pino-Logger и Pino-Pretty вместе - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть существующий код, который использует express-pino-logger .Эти слова прекрасно подходят для нашей установки стека ELK, но довольно прискорбно (протоколирует JSON) при локальном запуске.

Я бы хотел использовать pino-pretty , чтобы локальное использование не было проблемой.

В pino-pretty-express есть альтернатива, которая решает проблему, но использует собственный симпатичный форматтер.Я бы хотел использовать стандартные пакеты от pinojs, если бы мог.

Вот что у меня есть:

// with just pino-pretty installed, pino works out of the box
const pino = require('pino')
const logger = pino({
  prettyPrint: true
})

logger.info('hi') // prints pretty

И:

// adding this option to express-pino-logger, doesn't work
const pino = require('express-pino-logger')
const logger = pino({
  prettyPrint: true
})

logger.info('hi') // does NOT print pretty

Ответы [ 2 ]

0 голосов
/ 21 августа 2019

Я предполагаю, что экспресс-логин pino явно используется для записи уникальных идентификаторов запросов.Существует альтернативный подход, использующий http-context и node-uuid (хотя я не уверен насчет результатов тестирования)

Вы можете создать уникальный uuid перед вызовом каждого запроса, например

const uuid = require('node-uuid');
const httpContext = require('express-http-context');
....
  app.use(httpContext.middleware);
 app.use((req, res, next) => {
            httpContext.set('reqId', uuid.v4());
            next();
        });

.. requestId можно получить где угодно из httpContext.Нет необходимости полагаться на передаваемый объект req. Пример использования в пользовательской реализации службы PinoLogger

public infoLogService (fileName): pino.Logger {
        return pino({
            level: 'info',
            name: this.appService.getApp_name(),    

            messageKey: 'feedback-Logs',
            base: {pid: process.pid, hostname: os.hostname,
                timestamp: this.getTimeStamp(),
                appName: this.appService.getApp_name(),
                fileName: fileName,
                request_id: isNullOrUndefined(httpContext.get('reqId')) ? 'Not an actual request ' : httpContext.get('reqId')
            },
            enabled: true,
            useLevelLabels: true,
        });
    }

Для каждого http-вызова мы получаем UUID.для других типов журналов, таких как вызов регистратора до того, как приложение начнет обнаруживать, если соединение с базой данных прошло успешно, uuid не будет и, следовательно, было передано сообщение по умолчанию

0 голосов
/ 28 сентября 2018

Я решил свою собственную проблему, я думаю.

Ключ лежит в самом последнем примере на странице express-pino-logger :

'use strict'

const pino = require('pino')()
const expressPino = require('express-pino-logger')({
  logger: pino
})

Вот мое решение:

// use pino-pretty and express-pino-logger together
const basicPino = require('pino')
const basicPinoLogger = basicPino({ prettyPrint: true })
const expressPino = require('express-pino-logger')({
  logger: basicPinoLogger
})

const logger = expressPino.logger

logger.info('hi') // prints pretty
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...