2009-09-29 10 views
5

एक बड़े एप्लिकेशन लॉगिंग में आवश्यक है, लेकिन जब कई डेवलपर कोड पर काम करते हैं, तो लॉग अराजक हो सकते हैं। एक लिख सकते हैं:बड़े जावा एप्लिकेशन में लॉगिंग को मानकीकृत करने के तरीके

log.info("Loaded " + rowCount + " recodrs from the database."); 

एक और की तरह कुछ कर सकता:

log.debug("Records read={}", rowCount); 

एक तीसरा डेवलपर सोच सकते हैं इस उचित तरीका है:

log.trace("Record(s) read: " + NumberFormat.getInstance().format(rowCount) 
      + ", values: " + values); 

यह लॉग कठिन हो जाएँगे पढ़ने के लिए, और पार्स करने के लिए बहुत कठिन है।

डेवलपर्स को उन लोगो का उत्पादन करने के लिए क्या मार्गदर्शन मिल सकता है जिनके पास लगातार होने का मौका है, और वास्तव में अन्य लोगों द्वारा उपयोग योग्य हो सकता है? लॉगिंग के बारे में एक नीति क्या अच्छा होगा? और यदि हां, तो इसमें क्या शामिल होना चाहिए? इस नीति को लागू करने के लिए एक एपीआई (लॉगिंग ढांचे के ऊपर) होना चाहिए?

मैं कोड को समान रूप से देखने के तरीके के बारे में भी उत्सुक हूं, लेकिन वास्तविक उत्पादन के बारे में अधिक महत्वपूर्ण सवाल है।

उत्तर

5

क्या एक अच्छा लॉग बयान स्तर का गठन किया पर IMHO प्रवेश के दिशा निर्देशों यहाँ तक कि बड़े चौखटे और उत्पादों, मुख्य रूप से की वजह से अधिक महत्वपूर्ण दिशा निर्देशों

  • लॉग शब्दाडंबर से जुड़े के बीच दुर्लभ हैं log.debug() को कॉल करने के लिए एक कॉल के साथ लपेटा जाना चाहिए ताकि यह जांच सके कि डीबग सक्षम है या नहीं। डेवलपर्स को अक्सर फाटल, त्रुटि, सूचना, डेबग और ट्रेस के बीच भेद प्राप्त करने की आवश्यकता होती है - सभी अपवाद घातक नहीं होते हैं, और सभी संदेश जानकारीपूर्ण नहीं होते हैं।
  • TRACE या समकक्ष का उपयोग - यह निष्पादन प्रवाह के लिए आरक्षित होना चाहिए। आदर्श रूप से, नियंत्रण प्रवाह को इंगित करने के लिए कोई अन्य लॉग विवरण आवश्यक नहीं है।
  • DEBUG बनाम INFO - DEBUG विवरण अक्सर डेवलपर्स और सहायक कर्मियों के लिए होते हैं; जानकारी अक्सर उपयोगकर्ताओं और प्रशासकों के लिए होती है।
  • ओवरराइड toString() - यह जटिल वस्तुओं

कहा की राज्य प्रवेश करने के लिए उपयोगी है मैं निम्नतम स्तर पर कुछ सामान्य अंगूठे नियमों का पालन करें:

  • लॉग डेटा के रूप में स्वरूपण के बिना। इस तरह, किसी त्रुटि के मामले में, मुझे पता है कि लॉगजर, फॉर्मेटर और एप्लिकेशन को एक ही समय में संदेह करने के बजाय समस्या का कारण क्या था।
  • जब तक आप DEBUG या TRACE स्विच नहीं कर रहे हैं तब तक बहुत अधिक स्ट्रिंग ऑब्जेक्ट्स बनाने से बचें। संक्षेप में, बहुत से तारों को संयोजित करने से बचें। भले ही log4j अंततः जांचता है कि DEBUG सक्षम है या नहीं, स्ट्रिंग ऑब्जेक्ट्स बनाए गए हैं, और यही कारण है कि लॉग कॉल रैपिंग महत्वपूर्ण है। slf4j helps avoids this via the use of parameterized messages
+0

अपने अंतिम बिंदु के बारे में, वास्तव में आपको slf4j (सरल लॉग फेकाडे 4 जावा) का उपयोग करने की सलाह देते हैं जो इसकी देखभाल करने में मदद करता है और आपके लॉगिंग संदेश में स्ट्रिंग इंटरपोलेशन की अनुमति देता है। चूंकि slf4j सिर्फ एक मुखौटा है, इसलिए आप आसानी से लॉगिंग फ्रेमवर्क कार्यान्वयन स्विच कर सकते हैं। –

+0

@ डीजे, slf4j पर अपने बिंदु से सहमत हैं। मैं लॉगिंग फ्रेमवर्क के बारे में बहुत अजीब होने से बचना चाहता था, क्योंकि प्रश्न में केवल दूसरा कोड स्निपेट slf4j के उपयोग को इंगित करता है। –

1

आप विधियों में पारित होने के लिए एओपी (AspectJ सर्वोत्तम है) का उपयोग कर सकते हैं। आप केवल विधियों के लिए पॉइंटकट भी कर सकते हैं, इसलिए यह बहुत अधिक लॉगिंग नहीं होगा। आप विधि एनोटेशन जैसे @ लोगेबल और सेट पॉइंटकट लिख सकते हैं, इसलिए उन पैराम के साथ हर विधि लॉग हो जाती है।

मुझे लगता है कि पहलुओं को यहां जाने का सबसे अच्छा तरीका है।

example

+0

लॉगिंग वह उदाहरण है जहां पहलू ओरिएंटेड प्रोग्रामिंग चमकती है! एक पहलू को परिभाषित करें और आप इसे अपने सभी कोड में आसानी से बुना सकते हैं, और जब आप उत्पाद भेजते हैं तो इसे छोड़ दें। – NomeN

2

संदेशों का मानकीकरण, या तो एपीआई या स्ट्रिंग स्वरूपों के माध्यम से डेवलपर्स को संदर्भित जब लॉग बयान का निर्माण। उन्हें लॉग इन करने के लिए भी, प्रोग्राम में इस तरह के टेक्स्ट टाइप नहीं करना चाहिए, ठीक उसी कारण से आप कॉल करते हैं। स्वाभाविक रूप से, इसका मतलब है कि आपको नीति की भी आवश्यकता है, और यह सुनिश्चित करने के लिए समीक्षा की जाती है कि नीति का सम्मान किया जाए। अधिक वर्बोज़ बयान डिबग बयान के रूप में प्रकट करना चाहिए, और कॉल -

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