Winston Logging – niveles separados para transportes separados

Estoy usando Winston para el registro con 2 transportes diferentes: Archivo y MongoDB. He establecido el nivel para Archivo como “INFO” y para MongoDB como “ERROR”. Si ahora me registro,

log.info('some info...'); log.warn('some Warning...'); log.error('some error...'); 

Todos estos irían al LogFile, y solo el error iría a la base de datos. Solo quiero que los mensajes de información vayan a Archivo, y ninguno más.

Entiendo los niveles de registro del sistema en Winston, y solo el error va a MongoDB porque es el nivel más alto. Dado que INFO es un nivel inferior, cualquier registro con el nivel INFO o superior va al archivo (según mi definición de registrador)

He leído aquí pero no pude encontrar una respuesta. Incluso si creo niveles personalizados, ¿cómo puedo restringir cada transporte a un solo nivel de registro?

ver esta respuesta He escrito una envoltura para Winston que cubre el api básico. necesita extenderse para registrar metadatos, pero por lo demás es un buen comienzo. Por supuesto, tendrá que ajustar esto para sus necesidades de MongoDB.

Tuve un problema similar y esto es lo que se me ocurrió. Esto se puede hacer simplemente configurando las funciones de registro para funciones vacías. Este es un código mío que modifiqué que hizo algo similar. Este código toma customSilenceLevelLow y customSilenceLevelHigh y cualquier función de registro con un valor inferior o igual a customSilenceLevelLow se establece en una función vacía y cualquier función de registro con un valor superior o igual a customSilenceLevelHigh se establece en una función vacía

por lo que en este código solo los registros de información de nivel, info2 e info3 se registran en la consola. el rest no.

NOTA: No probé estos cambios por lo que podría haber algunos errores de syntax, pero la lógica debería ser buena.

 winston = require("winston") var levels = {levels: { debug: 0, debug2: 1, debug3: 2, verbose: 3, verbose2: 4, verbose3: 5, info: 6, info2: 7, info3: 8, silly: 9, warn: 10, error: 11 }, colors: { debug: "blue", debug2: "cyan", debug3: "grey", verbose: "cyan", verbose2: "magenta", verbose3: "blue", info: "green", info2: "magenta", info3: "grey", silly: "green", warn: "yellow", error: "red" }} //needed so that new levels and colors are recognized winston.setLevels(levels.levels) winston.addColors(levels.colors); //add color to log text winston.default.transports.console.colorize = true winston.default.transports.console.prettyPrint = true //false is default silences transport winston.default.transports.console.silent = false winston.default.transports.console.level = "debug" var customSilenceLevelLow = "info" var customSilenceLevelHigh = "info3" for (var k in levels.levels) { if (levels.levels[k] <= levels.levels[customSilenceLevelLow] || levels.levels[k] >= levels.levels[customSilenceLevelHigh]) { //create an empty function to silence logs winston[k] = function () {} } } 

He respondido esto en otro post :


De acuerdo con la documentación de Winston, el comportamiento predeterminado es registrar todos los mensajes que tienen al menos el nivel de registro específico.

Winston le permite definir una propiedad de nivel en cada transporte que especifica el nivel máximo de mensajes que un transporte debe registrar.

Pero hay maneras de cumplir sus requisitos.
Intentaré mostrarte algunas de las posibilidades, puedes elegir el método que mejor se adapte a ti.


1. Transportes personalizados ( Recomendado ):

Puede crear un transporte personalizado y registrar solo los niveles que desee.
Aquí hay un ejemplo para darte una idea:

 let mainLogger = new (winston.Logger)({ transports: [ new (winston.transports.Console)(), ] }); class CustomTransport extends winston.Transport { constructor(options) { super(options); this.name = 'customLogger'; this.level = options && options.level || 'info'; this.levelOnly = options && options.levelOnly; this.levels = options && options.levels || []; } log(level, msg, meta, callback) { if (!this.levelOnly || this.levels.indexOf(level) > -1) { mainLogger[level](msg, meta); } callback(null, true); } } winston.transports.CustomTransport = CustomTransport; let myLogger = new winston.Logger({ transports: [ new (winston.transports.CustomTransport)({ levelOnly: true, levels: ['info'], }), ] }); myLogger.info('will be logged'); myLogger.warn('will NOT be logged'); myLogger.info('will be logged as well'); 

2. Utilice winston-levelonly

Este es un tenedor del paquete original de Winston. El tenedor está en https://github.com/damianof/winston
Esta versión agrega una opción de solo nivel para hacer que Winston registre solo el nivel especificado.


Al final, me gustaría animarle a leer estas discusiones relevantes: