Node.js - 记录/使用摩根和温斯顿

时间:2015-01-12 16:29:40

标签: node.js logging express winston

我们使用morgan来记录我们的快速转换:

    var morgan  = require('morgan');
    morgan('combined');
    // a format string
    morgan(':remote-addr :method :url :uuid');
    // a custom function
    morgan(function (req, res) {
      return req.method + ' ' + req.url + ' ' + req.uuid;
    })

此外,我们使用winston来记录其他日志记录:

   var winston = require('winston');
    var logger = new (winston.Logger)({
    transports: [
             new (winston.transports.Console)({ level: 'info' }),
              new (winston.transports.File)({ filename: '/var/log/log-file.log' })
     ]
    });

有没有办法将两个记录器组合在一起?现在的情况是,当morgan写入winston时,/var/log/log-file.log会写入我的标准输出。

我希望记录器文件将结合使用快速转换信息和我想要的其他信息(logger.info())..

5 个答案:

答案 0 :(得分:115)

这篇文章对你想做的事情做得很好。

http://tostring.it/2014/06/23/advanced-logging-with-nodejs/

对于您的特定代码,您可能需要以下内容:

var logger = new winston.Logger({
    transports: [
        new winston.transports.File({
            level: 'info',
            filename: './logs/all-logs.log',
            handleExceptions: true,
            json: true,
            maxsize: 5242880, //5MB
            maxFiles: 5,
            colorize: false
        }),
        new winston.transports.Console({
            level: 'debug',
            handleExceptions: true,
            json: false,
            colorize: true
        })
    ],
    exitOnError: false
}),

logger.stream = {
    write: function(message, encoding){
        logger.info(message);
    }
};

app.use(require("morgan")("combined", { "stream": logger.stream }));

这将设置Winston将日志写入控制台以及文件。然后,您可以使用最后一个表达式将摩根中间件的输出传递给winston。

答案 1 :(得分:14)

在打字稿中:

let logger = new (winston.Logger)({
    exitOnError: false,
    level: 'info',
    transports: [
        new (winston.transports.Console)(),
        new (winston.transports.File)({ filename: 'app.log'})
    ]
})

class MyStream {
    write(text: string) {
        logger.info(text)
    }
}
let myStream = new MyStream()
app.use(morgan('tiny', { stream: myStream }));

答案 2 :(得分:7)

更新最后一行以删除警告

app.use(require("morgan")("combined", { stream: logger.stream }));

答案 3 :(得分:0)

摩根(Morgan)有一个以\n结尾的消息的坏习惯,因此为了使事情井井有条,您可能需要先删除消息,然后再将其写入Winston。

这可以通过许多不同的方式来完成,例如在winston中的格式方面,或者通过更新流以不编写\n

class MyStream {
    write(text: string) {
        logger.info(text.replace(/\n$/, '');
    }
}
let myStream = new MyStream()
app.use(morgan('tiny', { stream: myStream }));

答案 4 :(得分:0)

用于Typescript的另一种解决方法,而无需创建类是

let logger = new (winston.Logger)({
    exitOnError: false,
    level: 'info',
    transports: [
        new (winston.transports.Console)(),
        new (winston.transports.File)({ filename: 'app.log'})
    ]
})

const myStream = {
    write: (text: string) => {
        logger.info(text)
    }
}

app.use(morgan('combined', { stream: myStream }));

此解决方案来自Github页面https://github.com/winstonjs/winston/issues/1385。但是,请务必注意,我们的代码之间存在细微差别。代替:

app.use(morgan('combined', { myStream }));

我使用:

app.use(morgan('combined', { stream: myStream }));

这对我的帮助不大,因为我在创建类上不是很大。