2012-12-07 13 views
13

Sto lavorando a un'applicazione node.js con diverse dozzine di moduli e utilizzando bunyan per la registrazione (output JSON, più flussi configurabili). Ho cercato buoni esempi su come implementare un'istanza su tutti i moduli, ma non ho visto quello che sembra essere un esempio davvero pulito da cui posso imparare.Registrazione comune per nodo, applicazione rapida - best practice?

Qui sotto illustra un approccio che funziona, ma mi sembra abbastanza inelegante (brutto). Sono nuovo del nodo & commonjs javascript in generale, quindi sto cercando consigli su come migliorarlo. Modulo

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

modulo: applicazione principale

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

o view the gist

eventuali raccomandazioni?

EDIT:.

Ho modificato il costruttore, rendendo il pattern Singleton esplicito (piuttosto che implicita come parte del 'require' comportamento

var log = null; 
function Logger(option) { 

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

e poi cambiato l'inizializzazione di prendere un parametro options

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

Quello che hai sembra un Singleton base costruito usando le funzionalità di require. Potresti implementare il tuo singleton, ma non sarebbe necessariamente meglio. L'iniezione di dipendenza potrebbe essere fatta, forse? – mtsr

+0

Grazie per la risposta - sì, è un singleton di base. Un paio di cose mi infastidiscono a riguardo (a) il comportamento di singleton è implicito, piuttosto che esplicito, (b) non ho trovato un modo pulito per il costruttore di prendere argomenti (diciamo un'opzione JSON) senza poi dover determinare se sono già stati caricati da un modulo precedente e (c) l'alternativa di passare un riferimento (come argomento) a ogni singolo modulo sembra disordinata/prolissa. – dewd

+0

Grazie per la risposta! Sì, è un singleton di base, anche se sembra un comportamento implicito piuttosto che definito. Ho esaminato [cattive pratiche?] (Http://stackoverflow.com/questions/9733201/is-it-a-bad-practice-to-use-the-requirejs-module-as-a-singleton), [modello singleton] (http://jasonwyatt.tumblr.com/post/8087061585/singleton-pattern-with-requirejs) più [utilizzando require for singletons] (http://stackoverflow.com/questions/5608685/using-requirejs -how-do-i-pass-in-global-objects-or-singletons-around) e sembrano affrontare il comportamento del costruttore meglio di quanto sopra. – dewd

risposta

1

se si utilizza express con node.js allora si può provare questo. per impostazione predefinita, la registrazione è disabilitata in veloce. è devi fare certe cose per ottenere i log che lavorano per la tua app. Per i log di accesso, è necessario utilizzare il middleware di Logger; per log di errore useremo Forever.Hope vi aiuterà .. Ecco un buon esempio How to Logging Access e gli errori in node.js

+1

grazie, questo è stato un utile riferimento.Avevo già usato un modello simile per middleware di registrazione rapida usando Bunyan, dove stavo cercando di creare una classe wrapper pulita che mi permettesse di usare la stessa istanza su tutti i moduli, con un metodo di inizializzazione che consentiva l'inoltro delle opzioni. Pubblicherò ciò che mi è venuto in mente ... – dewd

23

Singleton pattern in nodejs - is it needed? In realtà, Singleton non è forse necessaria in ambiente di nodo. Tutto quello che devi fare è creare un logger in un file separato dire, logger.js:

 
var bunyan = require("bunyan"); // Bunyan dependency 
var logger = bunyan.createLogger({name: "myLogger"}); 

module.exports = logger; 

Poi, recuperare questo logger da un altro modulo:

 
var logger = require("./logger"); 
logger.info("Anything you like"); 
+0

Mi piace questo approccio, ma come configurare il logger prima del suo primo utilizzo? Mi piacerebbe usarlo in questo modo, ma voglio impostare il percorso di output. Ho cercato di includere la funzione "init" in logger.js e impostare "module.exports" al suo interno, ma non è bello. –

+0

@lixiang Non creerà una nuova istanza di logger ogni volta che sarà necessario? – PixMach

+1

@PixMach, No, Il modulo require memorizzerà nella cache l'istanza dell'oggetto – lixiang

Problemi correlati