node.js - winston 未知记录器级别 : undefined

标签 node.js express logging winston

我使用 winston 来记录错误,在生产中它记录到文件,在开发中它记录到控制台。我还设置了其他日志传输,即用于将错误发送到 slack 的自定义传输。

下面是我的logger.js

const expressWinston = require('express-winston');
const { createLogger, format, transports } = require('winston');
const SlackAPIAccessDevTransport = require('./winston-slack');

const accessLogger = expressWinston.logger({
  transports: [
    new SlackAPIAccessDevTransport(),
  ],
  format: format.combine(
    format.colorize(),
    format.json(),
  ),
});

const logToFile = createLogger({
  transports: [
    new transports.File({
      json: true,
      maxFiles: 5,
      level: 'error',
      colorize: false,
      filename: 'logs/error.log',
      maxsize: 5242880, // 5MB
    }),
  ],
});

const logToConsole = createLogger({
  level: 'info',
  transports: [
    new transports.Console({
      format: format.combine(
        format.colorize(),
        format.simple(),
      ),
    }),
  ],
});
module.exports = {
  logToFile,
  logToConsole,
  accessLogger,
};

记录到文件工作正常,但对于控制台传输我得到级别未定义

这是我的错误中间件。

const Logger = require('../utils/logger');

module.exports = async (err, req, res, next) => {
  // log any kind of error
  console.log(err);
  const errorData = {
    date: new Date().toISOString(),
    env: process.env.NODE_ENV,
    level: 'error',
    name: err.name,
    message: err.message,
    api: req.url,
    method: req.method,
    stack: err.stack,
    body: req.body,
    client: req.connection.remoteAddress,
  };
  if (process.env.NODE_ENV === 'production') {
    Logger.logToFile.log(errorData);
  } else {
    Logger.logToConsole.log(err);
  }
return res.status(500).send('Something went wrong!');
}

最佳答案

您需要使用format.errors .

The errors format allows you to pass in an instance of a JavaScript Error directly to the logger. It allows you to specify whether not to include the stack-trace.

此外,最好为错误日志添加自定义格式。

例如

import { createLogger, format, transports } from 'winston';

const logFormatter = format.printf((info) => {
  let { timestamp, level, stack, message } = info;
  message = stack || message;
  return `${timestamp} ${level}: ${message}`;
});

const logToConsole = createLogger({
  level: 'info',
  format: format.errors({ stack: true }),
  transports: [
    new transports.Console({
      format: format.combine(format.colorize(), format.simple(), format.timestamp(), logFormatter),
    }),
  ],
});

const err = new Error('network');
logToConsole.error(err);
// or
logToConsole.log('error', err);

结果:

2021-01-22T06:46:07.088Z error: Error: network
    at Object.<anonymous> (/Users/ldu020/workspace/github.com/mrdulin/expressjs-research/src/stackoverflow/65822479/index.ts:19:13)
    at Module._compile (internal/modules/cjs/loader.js:1158:30)
    at Module.m._compile (/Users/ldu020/workspace/github.com/mrdulin/mongoose5.x-lab/node_modules/ts-node/src/index.ts:530:23)
    at Module._extensions..js (internal/modules/cjs/loader.js:1178:10)
    at Object.require.extensions.<computed> [as .ts] (/Users/ldu020/workspace/github.com/mrdulin/mongoose5.x-lab/node_modules/ts-node/src/index.ts:533:12)
    at Module.load (internal/modules/cjs/loader.js:1002:32)
    at Function.Module._load (internal/modules/cjs/loader.js:901:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:74:12)
    at main (/Users/ldu020/workspace/github.com/mrdulin/mongoose5.x-lab/node_modules/ts-node/src/bin.ts:212:14)
    at Object.<anonymous> (/Users/ldu020/workspace/github.com/mrdulin/mongoose5.x-lab/node_modules/ts-node/src/bin.ts:470:3)
2021-01-22T06:46:07.089Z error: Error: network
    at Object.<anonymous> (/Users/ldu020/workspace/github.com/mrdulin/expressjs-research/src/stackoverflow/65822479/index.ts:19:13)
    at Module._compile (internal/modules/cjs/loader.js:1158:30)
    at Module.m._compile (/Users/ldu020/workspace/github.com/mrdulin/mongoose5.x-lab/node_modules/ts-node/src/index.ts:530:23)
    at Module._extensions..js (internal/modules/cjs/loader.js:1178:10)
    at Object.require.extensions.<computed> [as .ts] (/Users/ldu020/workspace/github.com/mrdulin/mongoose5.x-lab/node_modules/ts-node/src/index.ts:533:12)
    at Module.load (internal/modules/cjs/loader.js:1002:32)
    at Function.Module._load (internal/modules/cjs/loader.js:901:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:74:12)
    at main (/Users/ldu020/workspace/github.com/mrdulin/mongoose5.x-lab/node_modules/ts-node/src/bin.ts:212:14)
    at Object.<anonymous> (/Users/ldu020/workspace/github.com/mrdulin/mongoose5.x-lab/node_modules/ts-node/src/bin.ts:470:3)

关于node.js - winston 未知记录器级别 : undefined,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65822479/

相关文章:

node.js - reactjs应用程序在服务和启动后不运行

javascript - 如何在 next.js 中使用 supertest 测试快速服务器?

javascript - 如何在 chrome 中获取 JS 错误以显示正确的行号?

sql - 选择sql查询以按嵌套json分组

javascript - 当用作 Node.js 的 JS 引擎时,Microsoft 的 ChakraCore 是否比 Google 的 V8 提供任何性能优势

asp.net-mvc-3 - 使用 IP 地址进行应用程序范围日志记录的模式

java - 如何分解 Java 8 和 SLF4J 中的条件日志检查?

Azure Monitor...还是 Log Analytics?还是应用洞察?还是运营洞察?或者

node.js - 如何使用 jwks-rsa 库获取 token 的 key child ( key ID)

javascript - 类型错误 : Cannot read property 'name' of undefined mysql query