微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Winston with classes - 为每个文件创建新实例

如何解决Winston with classes - 为每个文件创建新实例

我不确定,但我觉得这段代码有问题。假设我有一个 winston 类,其中每次使用记录器时都会创建一个新实例,即每个文件

这个逻辑有问题吗?

// In logger.js
const winston = require('winston');

class Winston {
    constructor(errorPath) {
        const format = winston.format;
        const customFormatter = format((info) => {
            return Object.assign({
                timestamp: info.timestamp
            },info);
        });

        let settings = {
            level: 'silly',format: winston.format.json(),transports: [
                new (winston.transports.File)({
                    filename: errorPath + '/error.log',level: 'error',handleExceptions: true,stack: true,format: format.combine(
                        format.timestamp(),customFormatter(),format.json()
                    )
                }),new (winston.transports.File)({
                    filename: errorPath + '/general.log',format.json()
                    )
                })
            ],exitOnError: false
        };
        settings.transports.push(new (winston.transports.Console)());
        return new winston.createLogger(settings);
    }
}

module.exports = Winston;

然后我们假设我们还有其他文件

a.js
const Loger = require('./logger');
const logger = new Loger('somepath');
logger.error('Some error');
logger.debug('Some debug');
b.js
const Loger = require('./logger');
const logger = new Loger('somepath');
logger.error('Some error');
logger.debug('Some debug');
c.js
const Loger = require('./logger');
const logger = new Loger('somepath');
logger.error('Some error');
logger.debug('Some debug');

这会产生不必要的开销吗?

解决方法

假设我有一个温斯顿课

这是第一个问题。您不应在此处使用 class。唯一的 class Winston 应该在 winston 库本身内。而您的类实际上只是一个工厂函数,例如 createLogger:它没有任何方法,并且构造函数返回一个对象。

每次使用记录器时都会创建一个新实例,即每个文件

除非每次记录一条消息时都创建一个新的记录器,否则可以为每个文件创建一个记录器,然后在文件中多次使用该记录器。

somepath 在每个文件中都是一样的

这实际上可能有问题。每个输出文件应该有一个传输,否则当两个记录器尝试同时写入同一个文件时,您可能会遇到竞争条件。

是的,如果它们共享相同的配置,那么创建多个记录器实例只是浪费。为什么不直接在 logger.js 中创建记录器并共享这个单个实例?

// logger.js
const winston = require('winston');

const errorPath = 'somepath';
const format = winston.format;
const customFormatter = format((info) => {
    return Object.assign({
        timestamp: info.timestamp
    },info);
});

let settings = {
    level: 'silly',format: winston.format.json(),transports: [
        new (winston.transports.File)({
            filename: errorPath + '/error.log',level: 'error',handleExceptions: true,stack: true,format: format.combine(
                format.timestamp(),customFormatter(),format.json()
            )
        }),new (winston.transports.File)({
            filename: errorPath + '/general.log',format.json()
            )
        })
    ],exitOnError: false
};
settings.transports.push(new (winston.transports.Console)());

module.exports = new winston.createLogger(settings);
// a-module.js
const logger = require('./logger');
logger.error('Some error');
logger.debug('Some debug');

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。