为什么错误日志出现在警告日志文件中 - Node.js & Winston



在我的Node.js REST API中,我使用Winston Logging将错误和信息日志打印到一个单独的文件中。这是我的Winston设置:

const { createLogger, format, transports } = require("winston");
const { timestamp, printf, errors } = format;
const logFormat = printf(({ level, message, timestamp, stack }) => {
return `${timestamp} ${level}: ${stack || message}`;
});
const logger = createLogger({
transports: [
//new transports.Console(),
new transports.File({
level: "info",
filename: "logsWarnings.log",
}),
new transports.File({
level: "error",
filename: "logsErrors.log",
}),
],
format: format.combine(
timestamp({ format: "YYYY-MM-DD HH:mm:ss" }),
format.json(),
format.prettyPrint(),
errors({ stack: true })
//logFormat
),
statusLevels: true,
});
module.exports = logger;

这是我的一个请求的例子(信息日志用于请求的详细信息(:

deleteUser: (req, res) => {
logger.info("This is an info log");
mySqlConnection.query(
"DELETE FROM Users WHERE user_id=?",
req.params.userid,
(err, rows) => {
try {
if (rows.affectedRows >= 1) {
res.send("user deleted successfully");
} else {
res.status(500).send("Can't delete row");
}
} catch (err) {
logger.error("this is error", { err });
}
}
);
},

我遇到一个问题,错误日志同时出现在错误日志文件和警告日志文件中。我该怎么修?

发生了什么

如文件中所述

winston中的日志记录级别符合RFC5424指定的严重性顺序:假设所有级别的严重性在数字上从最重要到最不重要。

常量级别={错误:0,警告:1,信息:2,http:3,详细:4,调试:5,愚蠢:6};

winston允许您在每个传输上定义一个级别属性,该属性指定传输应记录的最大消息级别。

这意味着什么例如:

您使用了";信息";logsWarnings.log文件的级别。这意味着你将把自己和更重要的级别(信息、警告和错误(记录到文件中。

对于logsErrors.log文件,您使用了"错误";数量这意味着它将只记录错误级别日志,因为";错误";具有最高的重要性。

这就是为什么要在logsWarnings.log文件中同时获取这两个信息。

解决方案:

您可以像一样分离记录器

...
const formatConf = format.combine(
timestamp({ format: "YYYY-MM-DD HH:mm:ss" }),
format.json(),
format.prettyPrint(),
errors({ stack: true })
//logFormat
);
const infoLogger = createLogger({
transports: [
//new transports.Console(),
new transports.File({
level: "info",
filename: "./logs/logsWarnings.log",
}),
],
format: formatConf,
statusLevels: true,
});
const errLogger = createLogger({
transports: [
new transports.File({
level: "error",
filename: "./logs/logsErrors.log",
}),
],
format: formatConf,
statusLevels: true,
});
...

使用类似:

errLogger.error("this is error", { err });
// or
infoLogger.info("This is an info log");

有关更多自定义,请参阅文档。

最新更新