2012-04-06 17 views

Respuesta

14

Por desgracia, el parche que Pesho mencionó parece que todavía no se incluirán en la versión oficial (ver el comentario de stephenbeeson en el pull request #149).

Entonces, usé una solución alternativa. Como Winston compara los atributos de nombre, se puede engañar mediante la definición del nombre de sí mismo:

winston = require 'winston' 

logger = new winston.Logger 
    transports: [ 
    new winston.transports.File 
     name: 'file#debug' 
     level: 'debug' 
     filename: '/tmp/debug.log' 
    new winston.transports.File 
     name: 'file#error' 
     level: 'error' 
     filename: '/tmp/error.log' 
    ] 
logger.error 'error' # both logs 
logger.debug 'debug' # on debug log 

Tal vez no elegante, pero al menos funciona.

9

Mientras tanto, se puede implementar un envoltorio rudimentaria usando la misma interfaz así

var winston = require('winston'); 
var configs = require('./env.js'); 

var debug = new winston.Logger({ 
    levels: { 
    debug: 0 
    }, 
    transports: [ 
    new (winston.transports.File)({ filename: configs.PATH_TO_LOG, level: 'debug'}), 
    new (winston.transports.Console)({level: 'debug'}) 
    ] 
}); 

var info = new winston.Logger({ 
    levels: { 
    info: 1 
    }, 
    transports: [ 
    new (winston.transports.File)({ filename: configs.PATH_TO_LOG, level: 'info'}), 
    new (winston.transports.Console)({level: 'info'}) 
    ] 
}); 

var warn = new winston.Logger({ 
    levels: { 
    warn: 2 
    }, 
    transports: [ 
    new (winston.transports.File)({ filename: configs.PATH_TO_LOG, level: 'warn'}), 
    new (winston.transports.Console)({level: 'warn'}) 
    ] 
}); 

var error = new winston.Logger({ 
    levels: { 
    error: 3 
    }, 
    transports: [ 
    new (winston.transports.File)({ filename: configs.PATH_TO_LOG, level: 'error'}), 
    new (winston.transports.Console)({level: 'error'}) 
    ] 
}); 

var exports = { 
    debug: function(msg){ 
    debug.debug(msg); 
    }, 
    info: function(msg){ 
    info.info(msg); 
    }, 
    warn: function(msg){ 
    warn.warn(msg); 
    }, 
    error: function(msg){ 
    error.error(msg); 
    }, 
    log: function(level,msg){ 
    var lvl = exports[level]; 
    lvl(msg); 
    } 
}; 

module.exports = exports; 

Esto cubrirá la API básica Winston. podría extenderse para los metadatos y así sucesivamente ...

4

Sólo tiene que dar al transporte de una costumbre name propiedad por lo que no tiene una colisión:

const logger = new (winston.Logger)({ 
    transports: [ 
    new (winston.transports.Console)(), 
    new (winston.transports.File)({ name: 'text', filename: logFile, json: false }), 
    new (winston.transports.File)({ name: 'json', filename: logFileJson }) 
    ] 
}); 

Usted puede leer más acerca de múltiples transportes en los documentos: https://github.com/winstonjs/winston#multiple-transports-of-the-same-type

+0

Intenté esto pero los mensajes siguieron escribiéndose en ambos, no pude entender cómo especificar cuándo escribir en cuál. Terminé creando un registrador por separado para dirigir ese archivo por separado cuando sea necesario. –

Cuestiones relacionadas