【问题标题】:Winston logger to log to two files温斯顿记录器记录到两个文件
【发布时间】:2017-03-23 11:11:59
【问题描述】:

我有两个不同的 winston 记录器,看起来像这样(有两个独立的记录器,因为它们根据我的功能编写不同的日志) - :

var security = new(winston.Logger)({
    transports: [
        new(require('winston-daily-rotate-file'))({
            filename: logDir + '/-security.log',
            datePattern: 'dd-MM-yyyy',
            prepend: true,
            json: false,
            timestamp: function() {
                return moment().format('D/MM/YYYY HH:mm:ss:SSS');
            }
        })
    ]
});

然后我还有一个:

var system = new(winston.Logger)({
    transports: [
        new(require('winston-daily-rotate-file'))({
            filename: logDir + '/-security.log',
            datePattern: 'dd-MM-yyyy',
            prepend: true,
            json: false,
            timestamp: function() {
                return moment().format('D/MM/YYYY HH:mm:ss:SSS');
            }
        })
    ]
});

但是,我还有一个verbose.log 文件,我希望将安全和系统日志文件中的所有日志也写入详细文件。最好的方法是什么?

我尝试将文件名(即verbose.log)添加到每个传输,但这不起作用,因为我收到错误

Error: Transport already attached: dailyRotateFile, assign a different name

【问题讨论】:

    标签: node.js logging winston


    【解决方案1】:

    这是 winston 的常见问题,但解决起来很简单。
    由于 winston 的编码方式,它无法区分您的两个传输本身,并且需要您通过给它们不同的名称来明确声明它们是独立的:

    var security = new(winston.Logger)({
        transports: [
            new(require('winston-daily-rotate-file'))({
    //=>
                name: 'foo',
    //<=
                filename: logDir + '/-security.log',
                datePattern: 'dd-MM-yyyy',
                prepend: true,
                json: false,
                timestamp: function() {
                    return moment().format('D/MM/YYYY HH:mm:ss:SSS');
                }
            })
        ]
    });
    
    var system = new(winston.Logger)({
        transports: [
            new(require('winston-daily-rotate-file'))({
    //=>
                name: 'bar',
    //<=
                filename: logDir + '/-security.log',
                datePattern: 'dd-MM-yyyy',
                prepend: true,
                json: false,
                timestamp: function() {
                    return moment().format('D/MM/YYYY HH:mm:ss:SSS');
                }
            })
        ]
    });
    

    名称本身并不重要,只要它不同,一个简单的方法是使用文件名和其他传输标识符。

    来源:issue #101 of the official Github

    编辑:

    var verbose = new(require('winston-daily-rotate-file'))({
        name: 'baz',
        filename: logDir + '/-verbose.log',
        datePattern: 'dd-MM-yyyy',
        prepend: true,
        json: false,
        timestamp: function() {
            return moment().format('D/MM/YYYY HH:mm:ss:SSS');
        }
    })
    
    var security = new(winston.Logger)({
        transports: [
            new(require('winston-daily-rotate-file'))({
    //=>
                name: 'foo',
    //<=
                filename: logDir + '/-security.log',
                datePattern: 'dd-MM-yyyy',
                prepend: true,
                json: false,
                timestamp: function() {
                    return moment().format('D/MM/YYYY HH:mm:ss:SSS');
                }
            }),
    //=>
            verbose
    //<=
        ]
    });
    
    var system = new(winston.Logger)({
        transports: [
            new(require('winston-daily-rotate-file'))({
    //=>
                name: 'bar',
    //<=
                filename: logDir + '/-security.log',
                datePattern: 'dd-MM-yyyy',
                prepend: true,
                json: false,
                timestamp: function() {
                    return moment().format('D/MM/YYYY HH:mm:ss:SSS');
                }
            }),
    //=>
            verbose
    //<=
        ]
    });
    

    【讨论】:

    • 好主意...这样我就允许将两个不同的日志保存到同一个文件中。但是,我希望能够将特定日志事件分别保存到安全和系统日志文件中 - 但同时我希望它们都将安全和系统日志事件保存到详细日志中。这有意义吗?
    • 您可以使用loglevel: 'verbose', filename: 'verbose.log', name: 'baz' 声明另一个传输,并将其附加到两个记录器
    猜你喜欢
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 2019-05-13
    • 2015-05-07
    • 2016-08-02
    相关资源
    最近更新 更多