Mon enregistreur est configuré comme suit:
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"
})
]
})
Ensuite, je me connecte une erreur comme celle-ci:
logger.error(`GET on /history`, { err });
Comment est-il possible de consigner la trace complète de la pile pour les erreurs via le transport d'erreur? J'ai essayé de passer dans le err.stack et il est sorti comme indéfini.
Merci !
Vous pouvez écrire un formateur pour passer error.stack
à enregistrer.
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 ......"}
(la sortie dépend de votre configuration)
La réponse de @ Ming m'a en partie expliquée, mais pour avoir une description de la chaîne avec l'erreur, voici comment j'ai obtenu le traçage complet de la pile sur le nôtre:
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' attribute
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 ...
logger.error (
GET on /history
, {err});
la variable err
est un objet d'erreur?
sinon, vous pouvez obtenir la trace en utilisant new Error().stack
et passez à winston.
Voici mon logger.js
avec 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;