Как зарегистрировать полную трассировку стека с помощью 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.