如果您希望将对象记录到控制台和文件中,您可以执行以下操作:
1.初始化2种格式。一个用于文件,另一个用于控制台。注意中JSON.stringify使用的方法consoleFormat
const winston = require("winston");
const { format, transports, createLogger } = winston;
const path = require("path");
const consoleloggerLevel = process.env.WINSTON_LOGGER_LEVEL || "info";
const consoleFormat = format.combine(
format.colorize(),
format.timestamp(),
format.align(),
format.printf((info) => {
return `${info.timestamp} - ${info.level}: [${info.label}]: ${
info.message
} ${JSON.stringify(info.metadata)}`;
})
);
const fileFormat = format.combine(
format.timestamp(),
format.label({ label: path.basename(process.mainModule.filename) }),
format.metadata({ fillExcept: ["message", "level", "timestamp", "label"] }),
format.json()
);
2.现在,创建记录器。
const logger = createLogger({
level: "info",
defaultMeta: { service: "some-random-service" },
format: fileFormat,
transports: [
new transports.File({
filename: path.join(__dirname, "../logs/error.log"),
level: "error",
}),
new transports.File({
filename: path.join(__dirname, "../logs/activity.log"),
maxsize: 5242880, //5MB
maxFiles: 5 // just in case
}),
],
});
3.仅在非生产环境中启用控制台日志记录:
if (process.env.NODE_ENV !== "production") {
logger.add(
new transports.Console({
level: consoleloggerLevel,
format: consoleFormat,
})
);
}
4.将其导出为默认记录器
module.exports = logger;
在logger.info("Server started listening", { port: 9000 } );
这将打印,
在控制台上:
2021-06-22T07:47:25.988Z - info: [index.js]: Server started listening {"service":"some-random-service", "port": 9000}
在文件中:
{"message":"Server started listening","level":"info","timestamp":"2021-06-22T07:47:25.988Z","label":"index.js","metadata":{"service":"some-random-service", "port": 9000}}