Как зарегистрировать полную трассировку стека с помощью Winston 3?

Мой регистратор настроен так:

const myFormat = printf(info => {
   return '${info.timestamp}: ${info.level}: ${info.message}: ${info.err}';
 });


 const logger =
   winston.createLogger({
   level: "info",
   format: combine(timestamp(), myFormat),

   transports: [
     new winston.transports.File({
     filename:
      "./logger/error.log",
        level: "error"
    }),
     new winston.transports.File({
       filename:
       "./logger/info.log",
       level: "info"
   })
  ]
})

Затем я выхожу из-за ошибки:

logger.error('GET on /history', { err });

Как можно регистрировать полную трассировку стека для ошибок с помощью транспорта ошибок? Я попытался пройти в err.stack, и это получилось неопределенным.

Спасибо !

Ответ 1

Вы можете написать форматировщик, чтобы передать error.stack для регистрации.

const errorStackFormat = winston.format(info => {
  if (info instanceof Error) {
    return Object.assign({}, info, {
      stack: info.stack,
      message: info.message
    })
  }
  return info
})

const logger = winston.createLogger({
  transports: [ ... ],
  format: winston.format.combine(errorStackFormat(), myFormat)
})

logger.info(new Error('yo')) // => {message: 'yo', stack: "Error blut at xxx.js:xx ......"} 

(выход будет зависеть от вашей конфигурации)

Ответ 2

От ответа @Ming я частично оказался там, но чтобы получить строковое описание с ошибкой, вот как я получил полную трассировку стека, работающую над нашей:

import winston from "winston";

const errorStackTracerFormat = winston.format(info => {
    if (info.meta && info.meta instanceof Error) {
        info.message = '${info.message} ${info.meta.stack}';
    }
    return info;
});

const logger = winston.createLogger({
    format: winston.format.combine(
        winston.format.splat(), // Necessary to produce the 'meta' property
        errorStackTracerFormat(),
        winston.format.simple()
    )
});

logger.error("Does this work?", new Error("Yup!"));

// The log output:
//   error: Does this work? Error: Yup!
//       at Object.<anonymous> (/path/to/file.ts:18:33)
//       at ...
//       at ...

Ответ 3

Вот мой logger.js с winston": "^3.1.0

const { createLogger, format, transports } = require('winston');
const { combine, timestamp, printf, colorize, splat } = format;

const myFormat = printf((info) => {
  if (info.meta && info.meta instanceof Error) {
    return '${info.timestamp} ${info.level} ${info.message} : ${info.meta.stack}';
  }
  return '${info.timestamp} ${info.level}: ${info.message}';
});

const LOG_LEVEL = process.env.LOG_LEVEL || 'debug';
const logger = createLogger({
  transports: [
    new (transports.Console)(
      {
        level: LOG_LEVEL,
        format: combine(
          colorize(),
          timestamp(),
          splat(),
          myFormat
        )
      }
    )
  ]
});
module.exports = logger;

Ответ 4

Для версии Winston 3.2.0+ следующее добавит трассировку стека в вывод журнала:

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

const { combine, timestamp, prettyPrint, colorize, errors,  } = format;


const logger = createLogger({
  format: combine(
    errors({ stack: true }), // <-- use errors format
    colorize(),
    timestamp(),
    prettyPrint()
  ),
  transports: [new transports.Console()],
});  

Ref: https://github.com/winstonjs/winston/issues/1338#issuecomment-482784056

Ответ 5

logger.error(GET on/history, {err});

переменная err является объектом ошибки?

если not- вы можете получить трассировку, используя new Error().stack и pass, чтобы winston.