मैं कई दर्जन मॉड्यूल के साथ एक नोड.जेएस अनुप्रयोग पर काम कर रहा हूं और लॉगिंग के लिए बुनियन का उपयोग कर रहा हूं (जेएसओएन आउटपुट, एकाधिक कॉन्फ़िगर करने योग्य धाराएं)। मैं सभी मॉड्यूल में एक उदाहरण को कार्यान्वित करने के अच्छे उदाहरणों की तलाश कर रहा हूं, लेकिन ऐसा नहीं देखा है कि वास्तव में एक साफ उदाहरण क्या है, मैं सीख सकता हूं।नोड, एक्सप्रेस एप्लिकेशन के लिए सामान्य लॉगिंग - सर्वोत्तम अभ्यास?
नीचे एक दृष्टिकोण दिखाता है जो काम करता है, लेकिन मेरे लिए काफी सुरुचिपूर्ण (बदसूरत) लगता है। मैं सामान्य रूप से & आमज जावास्क्रिप्ट नोड करने के लिए नया हूं, इसलिए इसे सुधारने के तरीके पर सिफारिशों की तलाश में हूं।
मॉड्यूल: ./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;
मॉड्यूल: मुख्य अनुप्रयोग
// 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();
कोई सुझाव?
संपादित करें:।
मैं 'की आवश्यकता होती है के व्यवहार के हिस्से के रूप कंस्ट्रक्टर संशोधित कर लिया है, सिंगलटन पैटर्न स्पष्ट (बजाय निहित बनाने
var log = null;
function Logger(option) {
// make the singleton pattern explicit
if (!Logger.log) {
Logger.log = this;
}
return Logger.log;
};
और फिर प्रारंभ बदल एक लेने के लिए विकल्प पैरामीटर
// 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
});
};
आप एक बुनियादी सिंगलटन की तरह दिखता है क्या आवश्यकता की कार्यक्षमता का उपयोग कर बनाया गया। आप अपना खुद का सिंगलटन लागू कर सकते हैं, लेकिन यह बेहतर नहीं होगा। निर्भरता इंजेक्शन किया जा सकता है, शायद? – mtsr
उत्तर के लिए धन्यवाद - हाँ, यह एक मूल एकल है। कुछ चीजें मुझे इसके बारे में परेशान करती हैं (ए) सिंगलटन व्यवहार स्पष्ट रूप से निहित है, (बी) मुझे कन्स्ट्रक्टर को तर्क लेने के लिए एक साफ तरीका नहीं मिला है (बिना विकल्प जेएसओएन) बिना यह निर्धारित करना है कि क्या वे पहले से ही पिछले मॉड्यूल द्वारा लोड हो चुके हैं, और (सी) प्रत्येक मॉड्यूल में एक संदर्भ (एक तर्क के रूप में) पास करने का विकल्प गन्दा/verbose लगता है। – dewd
उत्तर के लिए धन्यवाद! हां, यह एक मूल सिंगलटन है, हालांकि यह परिभाषित एक के बजाय एक अंतर्निहित व्यवहार प्रतीत होता है। मैंने देखा [बुरा अभ्यास?] (Http://stackoverflow.com/questions/9733201/is-it-a-bad-practice-to-use-the-requirejs- मॉड्यूल-as-a-singleton), [सिंगलटन पैटर्न] (http://jasonwyatt.tumblr.com/post/8087061585/singleton-pattern-with-requirejs) प्लस [सिंगलेट के लिए आवश्यकता का उपयोग करके] (http://stackoverflow.com/questions/5608685/using-requirejs -how-do-i-pass-in-global-items-or-singletons-around) और वे उपरोक्त की तुलना में कन्स्ट्रक्टर व्यवहार को बेहतर तरीके से संबोधित करते हैं। – dewd