2015-01-12 2 views
57

мы используем morgan для того, чтобы войти наш экспресс-преобразование:Node.js - регистрация/Использование морган и Winston

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()) ..

ответ

91

Эта статья делает отличную работу за то, что вы хотите сделать.

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, чтобы написать журнал на консоль, а также файл. Затем вы можете использовать последнее выражение для передачи вывода из промежуточного программного обеспечения morgan в winston.

+0

Можем ли мы использовать метку времени в этом процессе? – theChinmay

+0

@ theChinmay да, просто добавьте 'timestamp: true' в объект' Console' или 'File' – Skam

+8

Не похоже, что необходимо переопределить logger.stream .. В моем случае я смог выполнить' app. use (morgan («комбинированный», {поток: {write: message => logger.info (message)}})); ' –

5

Обновление последней строки, чтобы удалить предупреждение

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

В Машинопись:

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 })); 
+0

Почему крошечные и не комбинированные? –

 Смежные вопросы

  • Нет связанных вопросов^_^