2015-01-12 17 views
57

wir morgan nutzen, um unsere ausdrückliche Transformation zu protokollieren:Node.js - Protokollierung/Verwendung morgan und 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; 
    }) 
Auch

verwenden wir winston, um unsere anderen Protokollierung zu protokollieren:

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' }) 
    ] 
    }); 

Gibt es eine Möglichkeit, die beiden Logger miteinander zu kombinieren? Die Situation ist jetzt, dass morgan ist Schreiben auf meine Standard-Ausgabe, wenn winston schreibt /var/log/log-file.log.

Ich wünsche, dass die Logger-Datei aus dem Expresstransformationsinformation kombinieren, und von den anderen Informationen, die ich will (logger.info()) ..

Antwort

91

Dieser Artikel hat eine ausgezeichnete Arbeit für das, was Sie tun mögen.

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

Für Ihre spezifischen Code müssen Sie wahrscheinlich so etwas wie dieses:

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

Dies wird Winston einrichten ein Protokoll an die Konsole sowie eine Datei zu schreiben. Dann können Sie den letzten Ausdruck verwenden, um die Ausgabe der morgan-Middleware in winston zu übergeben.

+0

Können wir einen Zeitstempel in diesem Prozess verwenden? – theChinmay

+0

@theChinmay ja, fügen Sie einfach 'timestamp: true' in die' Console' oder 'File' Objekt – Skam

+8

Es scheint nicht wie es notwendig ist, logger.stream zu überschreiben .. In meinem Fall konnte ich' app. use (morgan ("kombiniert", {stream: message => logger.info (message)}}); ' –

5

Aktualisieren Sie die letzte Zeile Warnung

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

In Typoskript entfernen:

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

Warum klein und nicht kombiniert? –