sirve que para nodejs node logger log custom node.js logging express winston

que - Node.js-inicio de sesión/Usar morgan y winston



winston custom log (5)

morgan para registrar nuestra transformación expresa:

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

Además, utilizamos winston para registrar nuestro otro registro:

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

¿Hay alguna forma de combinar los dos registradores? La situación ahora es que morgan está escribiendo en mi salida estándar, cuando winston escribe en /var/log/log-file.log .

Deseo que el archivo de registro se combine a partir de la información de transformación expresa y de la otra información que deseo ( logger.info() ) ..


Actualice la última línea para eliminar la advertencia.

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


En mecanografiado:

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


Este artículo hace un excelente trabajo para lo que quieres hacer.

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

Para su código específico, probablemente necesite algo como esto:

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

Esto configurará Winston para escribir un registro en la consola, así como un archivo. Luego puede usar la última expresión para pasar la salida del middleware Morgan a Winston.


Morgan tiene la mala costumbre de terminar el mensaje con un /n por lo que para ordenar las cosas, es posible que desee eliminarlo antes de escribirlo en Winston.

Esto se puede hacer de muchas maneras diferentes, como en el lado del formato en Winston, o actualizando su transmisión para no escribir el /n

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


para Typecript, otra forma de hacerlo, sin necesidad de crear una clase es

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

Esta solución se obtuvo de esta página de Github https://github.com/winstonjs/winston/issues/1385 . Sin embargo, es importante tener en cuenta que existe una ligera diferencia entre nuestros códigos. En lugar de:

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

Yo suelo:

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

Esto me ayudó, ya que no soy demasiado grande para crear clases.