Wspólne logowanie dla węzła, ekspresowa aplikacja - najlepsza praktyka?

Pracuję nad aplikacją node.js z kilkudziesięcioma modułami i za pomocą bunyan do logowania (wyjście JSON, strumienie o wielu konfiguracjach). Szukałem dobrych przykładów implementacji instancji we wszystkich modułach, ale nie widziałem tego, co wydaje się być naprawdę czystym przykładem, którego mogę się nauczyć.

Poniżej przedstawiono podejście, które działa, ale wydaje mi się dość nieeleganckie (brzydkie). Jestem w ogóle nowym użytkownikiem javascript dla węzłów i commonjs, więc szukam zaleceń, jak go ulepszyć.

moduł: ./lib/logger

// load config file (would like this to be passed in to the constructor)
nconf.file({ file: fileConfig});
var logSetting = nconf.get('log');

// instantiate the logger
var Bunyan = require('bunyan');
var log = new Bunyan({
    name: logSetting.name,
streams : [
        { stream  : process.stdout, 
        level : logSetting.stdoutLevel},
        {    path : logSetting.logfile, 
            level : logSetting.logfileLevel}
    ],
serializers : Bunyan.stdSerializers
});

function Logger() {
};

Logger.prototype.info = function info(e) { log.info(e) };
Logger.prototype.debug = function debug(e) { log.debug(e) };
Logger.prototype.trace = function trace(e) { log.trace(e) };
Logger.prototype.error = function error(e) { log.error(e) };
Logger.prototype.warn = function warn(e) {  log.warn(e) };

module.exports = Logger;

moduł: główna aplikacja

// create the logger
var logger = require('./lib/logger)
var log = new logger();

// note: would like to pass in options -->  new logger(options)


module: any project module using logger
// open the logger (new, rely on singleton...)
var logger = require('./lib/logger');
var log = new logger();

lubzobacz opis

jakieś zalecenia?

EDYTOWAĆ:

Zmodyfikowałem konstruktor, sprawiając, że wzorzec singletonu jest jawny (a nie ukryty jako część zachowania „wymagaj”.

var log = null;
function Logger(option) {

// make the singleton pattern explicit
if (!Logger.log) {
    Logger.log = this;
}
    return Logger.log;
};  

a następnie zmienił inicjalizację, aby pobrać parametr opcji

// initialize the logger 
Logger.prototype.init = function init(options) {
log = new Bunyan({
    name: options.name,
    streams : [
        { stream  : process.stdout, 
            level : options.stdoutLevel},
        {    path : options.logfile, 
            level : options.logfileLevel}
    ],
    serializers : Bunyan.stdSerializers     
    });
};

questionAnswers(2)

yourAnswerToTheQuestion