如何解决如何在没有 MaxListenersExceededWarning 的情况下使用多个 winston 记录器
我目前正在解决 winston 的问题,但没有真正取得进展,阅读了多个堆栈问题,但似乎没有任何帮助。
我的最终目标是为我在应用程序中拥有的每个实体/路由实现消息中的自定义标签。
~/lib/winston.js
const appRoot = require('app-root-path');
const winston = require('winston');
const { combine,timestamp,label,printf } = winston.format;
const consoleFormat = printf(({ level,message,timestamp }) => {
return `${level.toUpperCase()} | ${timestamp} | [${label}] | ${message}`;
});
const options = {
appFile: {
level: 'info',filename: `${appRoot}/logs/app.log`,json: true,maxsize: 5242880,// 5MB
maxFiles: 5,colorize: false
},appErrorFile: {
level: 'error',filename: `${appRoot}/logs/app-error.log`,handleExceptions: true,console: {
level: 'debug',json: false,colorize: true
}
};
// Console logger
function createConsoleLogger(entity) {
const consoleLogger = winston.loggers.add(entity,{
format: combine(
label({ label: entity }),timestamp(),consoleFormat
),transports: [
new winston.transports.File(options.appFile),new winston.transports.File(options.appErrorFile)
]
});
// Don't console log in production environment
if (process.env.NODE_ENV !== 'production') {
consoleLogger.add(new winston.transports.Console(options.console));
}
return consoleLogger;
}
module.exports = {
createConsoleLogger
};
这是我的实现,它的使用次数有限,准确地说是 10,因为它是节点 eventListeners 的默认值。
这是我如何在 app.js(应用程序的起始文件)中使用它的示例。
require('events').EventEmitter.defaultMaxListeners = 20;
const { createConsoleLogger } = require('./lib/winston');
const log = createConsoleLogger('App');
log.info('Starting app...');
// OUT: INFO | 2020-12-29T06:38:19.956Z | [App] | Starting app...
堆栈上的许多答案都建议增加 defaultMaxListeners,正如您在我的代码中看到的那样,但另一个不建议这样做...对此的最佳解决方案是什么?我很想用 defaultMaxListeners 和自定义标签摆脱这个小“黑客”。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。