一起使用express-pino-logger和pino-pretty

时间:2018-09-28 14:22:54

标签: node.js express

我已有使用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

3 个答案:

答案 0 :(得分:2)

我想我已经解决了自己的问题。

关键在于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

答案 1 :(得分:0)

我想明确地将express pino记录器用于记录唯一的请求ID。还有一种使用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();
        });

..您可以从httpContext的任何位置获取requestId。无需依赖要传递的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并因此传递默认消息

答案 2 :(得分:0)

const pino = require('pino');
const expressPino = require('express-pino-logger');
const logger = pino({ level: process.env.LOG_LEVEL || 'info', prettyPrint: true });
const expressLogger = expressPino({ logger });