Gemeinsame Protokollierung für Knoten, Expressanwendung - Best Practice?

Ich arbeite an einer node.js-Anwendung mit mehreren Dutzend Modulen und benutze Bunyan für die Protokollierung (JSON-Ausgabe, mehrere konfigurierbare Streams). Ich habe nach guten Beispielen für die Implementierung einer Instanz in allen Modulen gesucht, aber ich habe noch kein wirklich sauberes Beispiel gesehen, von dem ich lernen kann.

Unten sehen Sie einen Ansatz, der funktioniert, mir aber ziemlich unelegant (hässlich) erscheint. Ich bin neu in Node & CommonJS JavaScript im Allgemeinen und suche nach Empfehlungen, wie ich es verbessern kann.

Modul: ./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;

Modul: Haupt-App

// 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();

oderSehen Sie sich das Wesentliche an

irgendwelche Empfehlungen?

BEARBEITEN:

Ich habe den Konstruktor so geändert, dass das Singleton-Muster explizit dargestellt wird (und nicht implizit als Teil des 'require'-Verhaltens.

var log = null;
function Logger(option) {

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

und änderte dann die Initialisierung, um einen Optionsparameter zu übernehmen

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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage