Winston记录器记录到两个文件

时间:2016-11-09 15:22:17

标签: node.js logging winston

我有两个不同的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

1 个答案:

答案 0 :(得分:0)

这是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
//<=
    ]
});