2012-12-07 12 views
13

मैं कई दर्जन मॉड्यूल के साथ एक नोड.जेएस अनुप्रयोग पर काम कर रहा हूं और लॉगिंग के लिए बुनियन का उपयोग कर रहा हूं (जेएसओएन आउटपुट, एकाधिक कॉन्फ़िगर करने योग्य धाराएं)। मैं सभी मॉड्यूल में एक उदाहरण को कार्यान्वित करने के अच्छे उदाहरणों की तलाश कर रहा हूं, लेकिन ऐसा नहीं देखा है कि वास्तव में एक साफ उदाहरण क्या है, मैं सीख सकता हूं।नोड, एक्सप्रेस एप्लिकेशन के लिए सामान्य लॉगिंग - सर्वोत्तम अभ्यास?

नीचे एक दृष्टिकोण दिखाता है जो काम करता है, लेकिन मेरे लिए काफी सुरुचिपूर्ण (बदसूरत) लगता है। मैं सामान्य रूप से & आमज जावास्क्रिप्ट नोड करने के लिए नया हूं, इसलिए इसे सुधारने के तरीके पर सिफारिशों की तलाश में हूं।

मॉड्यूल: ./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(); 

या view the gist

कोई सुझाव?

संपादित करें:।

मैं 'की आवश्यकता होती है के व्यवहार के हिस्से के रूप कंस्ट्रक्टर संशोधित कर लिया है, सिंगलटन पैटर्न स्पष्ट (बजाय निहित बनाने

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

आप एक बुनियादी सिंगलटन की तरह दिखता है क्या आवश्यकता की कार्यक्षमता का उपयोग कर बनाया गया। आप अपना खुद का सिंगलटन लागू कर सकते हैं, लेकिन यह बेहतर नहीं होगा। निर्भरता इंजेक्शन किया जा सकता है, शायद? – mtsr

+0

उत्तर के लिए धन्यवाद - हाँ, यह एक मूल एकल है। कुछ चीजें मुझे इसके बारे में परेशान करती हैं (ए) सिंगलटन व्यवहार स्पष्ट रूप से निहित है, (बी) मुझे कन्स्ट्रक्टर को तर्क लेने के लिए एक साफ तरीका नहीं मिला है (बिना विकल्प जेएसओएन) बिना यह निर्धारित करना है कि क्या वे पहले से ही पिछले मॉड्यूल द्वारा लोड हो चुके हैं, और (सी) प्रत्येक मॉड्यूल में एक संदर्भ (एक तर्क के रूप में) पास करने का विकल्प गन्दा/verbose लगता है। – dewd

+0

उत्तर के लिए धन्यवाद! हां, यह एक मूल सिंगलटन है, हालांकि यह परिभाषित एक के बजाय एक अंतर्निहित व्यवहार प्रतीत होता है। मैंने देखा [बुरा अभ्यास?] (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

उत्तर

1

अगर आप Node.js साथ एक्सप्रेस का उपयोग कर रहे तो आप इस कोशिश कर सकते हैं। डिफ़ॉल्ट रूप से, प्रवेश एक्सप्रेस आप। में अक्षम है अपने ऐप के लिए लॉग इन करने के लिए कुछ सामान करना है। एक्सेस लॉग के लिए, हमें लॉगर मिडलवेयर का उपयोग करने की आवश्यकता है; त्रुटि लॉग के लिए हम Forever.Hope का उपयोग करेगा यह यहाँ आप में मदद मिलेगी .. एक अच्छा उदाहरण How to Logging Access और Node.js

+1

धन्यवाद, यह एक उपयोगी संदर्भ था।मैंने पहले से ही बुनयान का उपयोग करके एक्सप्रेस लॉगिंग मिडलवेयर के लिए एक समान पैटर्न का उपयोग किया था, जहां मैं संघर्ष कर रहा था, एक क्लीन रैपर क्लास बनाने में था, जिसने मुझे सभी मॉड्यूल में एक ही उदाहरण का उपयोग करने की इजाजत दी, जिसमें शुरुआती विधि के साथ विकल्पों को पारित करने की अनुमति दी गई। मैं जो पोस्ट करूँगा पोस्ट करूंगा ... – dewd

23

Singleton pattern in nodejs - is it needed? वास्तव में, सिंगलटन शायद नोड के परिवेश में जरूरत नहीं है में त्रुटियाँ है। तुम सब करने की ज़रूरत है, एक अलग फाइल में एक लकड़हारा बनाने के लिए कहते हैं logger.js:

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

module.exports = logger; 

फिर, एक अन्य मॉड्यूल से इस लकड़हारा पुनः प्राप्त:

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

मुझे यह दृष्टिकोण पसंद है, लेकिन इसके पहले उपयोग से पहले लॉगर को कॉन्फ़िगर कैसे करें? मैं इसे इस तरह से उपयोग करना चाहता हूं, लेकिन मैं आउटपुट पथ सेट करना चाहता हूं। मैंने logger.js में "init" फ़ंक्शन को शामिल करने का प्रयास किया और इसमें "module.exports" सेट किया, लेकिन यह अच्छा नहीं है। –

+0

@lixiang यह हर बार आवश्यक होने पर लॉगर का एक नया उदाहरण बनाने वाला नहीं है? – PixMach

+1

@PixMach, नहीं, आवश्यकता मॉड्यूल ऑब्जेक्ट इंस्टेंस कैश करेगा – lixiang

संबंधित मुद्दे