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