Почему winston дважды регистрирует сообщение об ошибке в одной и той же ошибке? - PullRequest
1 голос
/ 24 февраля 2020

EDIT: очевидно, это известная проблема с winston: https://github.com/winstonjs/winston/issues/1739

У меня есть Node-сервер, который хранит журналы в файлах, mongoDB и показывает их в консоли во время разработки.

Когда я выдаю сообщение об ошибке:

throw new Error("The error message.");

Уинстон регистрирует ошибку следующим образом:

2020-02-24 12:20:19 - error: "The error message.The error message."

Как видите, строка сообщения дублируется. Почему? Все мои журналы имеют одинаковую проблему дублирования.

Я пытался поиграться с форматом, но безрезультатно. Любая помощь приветствуется!

Мой код:

const { createLogger, format, transports } = require("winston");
require("winston-mongodb");
require("express-async-errors");

// Manually throwing the exception will let winston handle the logging
process.on("unhandledRejection", (ex) => {
  throw ex;
});

// Log to files
const logger = createLogger({
  level: "verbose",
  format: format.combine(
    format.timestamp({
      format: 'YYYY-MM-DD HH:mm:ss'
    }),
    format.errors({ stack: true }),
    format.splat(),
    format.json()
  ),
  transports: [
    new transports.File({filename: "./logs/combined.log", level: "verbose"}),
  ],
  transports: [
    new transports.File({filename: "./logs/error.log", level: "error"}),
    new transports.File({filename: "./logs/combined.log"}),
  ],
  exceptionHandlers: [
    new transports.File({ filename: "./logs/exceptions.log" }),
    new transports.File({ filename: "./logs/combined.log" }),
  ],
  handleExceptions: true,
});

// Log to database
logger.add(new transports.MongoDB({
  db: "mongodb://localhost:27017/rest-api-mongodb",
  options: {
    useUnifiedTopology: true,
    useNewUrlParser: true,
  },
  metaKey: "stack",
}));

// This is used to make the console logging more readable
// Enabled only in development
if (process.env.NODE_ENV === "development" || process.env.NODE_ENV === undefined) {
  const consoleFormat = format.printf(function(info) {
    //console.log(info);
    return `${info.timestamp} - ${info.level}: ${JSON.stringify(info.message, null, 4)}`;
  });

  logger.add(new transports.Console({
    format: format.combine(
      format.colorize(),
      format.timestamp({
        format: 'YYYY-MM-DD HH:mm:ss'
      }), consoleFormat),
    level: "debug",
    handleExceptions: true,
    colorize: true,
    prettyPrint: true
  }));
}

module.exports = logger;

1 Ответ

0 голосов
/ 22 марта 2020

Да, это довольно плохое поведение.

Мой обходной путь (для моего самого базового c варианта использования) - жестко закодировать строку сообщения, зная, что winston извлечет и объединит сообщение из стека. в любом случае:

logger.error("Uncaught async err: ", err);

Должно дать

2020-02-24 12:20:19 - error: "Uncaught async err: The error message."

Это не здорово, потому что я полагаюсь на плохое поведение, чтобы обойти это. Если это будет исправлено, мне придется скорректировать мою регистрацию.

...