0

我正在使用带有winston -loggly-bulk的 winston 将消息记录到 Loggly。我想记录我的服务器收到的所有请求。使用morgan,我会这样做:

app.use(morgan('dev'));

我们可以对winston做类似的事情吗?

4

1 回答 1

0

为了使它工作,我结合winstonmorgan打包。

1. 步骤

创建一个logger您将在服务器中用于将消息记录到Loggly. 为此,您可以使用winstonwinston-loggly-bulk。您可以为日志创建自定义格式,我还添加了部分代码来检查环境是否不是production,在这种情况下,它也会在控制台中记录消息(开发的良好实践)。

const winston = require('winston');
const { Loggly } = require('winston-loggly-bulk');

// Levels: ['error', 'warn', 'info', 'http', 'verbose', 'debug', 'silly']
const logger = winston.createLogger();

logger.add(new Loggly({
  token: process.env.LOGGLY_TOKEN,
  subdomain: process.env.LOGGLY_SUBDOMAIN,
  tags: [process.env.NODE_ENV, process.env.SERVER_INSTANCE],
  json: true
}));

const custom_format = winston.format.printf(({ level, message, timestamp, ...metadata }) => `${level}: ${message}\n${(metadata && Object.keys(metadata).length) ? JSON.stringify(metadata, null, 4) : ''}`);

//
// If we're not in production then log to the `console` with the format:
// `${info.level}: ${info.message} {...rest}`
//
if (process.env.NODE_ENV !== 'production') {
  logger.add(new winston.transports.Console({
    format: custom_format
  }));
}

module.exports = {
  logger
};

2. 步骤

导入您loggermorgan用于记录请求的部分代码,并将morgan消息流式传输到logger. 同样,我检查了环境是否为production,因为我不想在development.

if (process.env.NODE_ENV === 'development') {
  app.use(morgan('dev'));
} else {
  app.use(morgan(':remote-addr - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent" :response-time ms', { stream: { write: message => logger.log('info', message.trim(), { tags: ['http'] }) } }));
}
于 2021-08-23T17:07:01.573 回答