2008-10-14 15 views
18

मैं लॉगिंग के लिए log4net और System.Diagnostics.Trace का उपयोग करने के बीच अंतर की जांच कर रहा हूं, और मैं देखे गए प्रदर्शन अंतरों के बारे में उत्सुक हूं।क्या लॉग 4नेट सिस्टम से बहुत धीमा है। डायग्नोस्टिक्स। ट्रेस?

मैं एक परीक्षण आवेदन कई परिदृश्य में दोनों प्रवेश तरीकों के प्रदर्शन की तुलना करने के लिए बनाया है, और मैं खोजने रहा है कि log4net Trace वर्ग की तुलना में काफी धीमी है। उदाहरण के लिए, एक परिदृश्य में जहां मैं कोई स्ट्रिंग स्वरूपण के साथ 1,000 संदेश लॉग करता हूं, 1,000 परीक्षणों से log4net का औसत निष्पादन समय 9.00ms है। Trace 1.13ms के माध्य के साथ निष्पादित करता है। लॉग 4नेट निष्पादन समय में मेरे कई परीक्षण मामलों में अपेक्षाकृत बड़ी मात्रा में भिन्नता है; बाहरी लंबे निष्पादन की आवधिक प्रकृति जीसी हस्तक्षेप का सुझाव देती है। सीएलआर प्रोफाइलर के साथ घूमते हुए पुष्टि करता है कि log4net.Core.LoggingEvent ऑब्जेक्ट्स के टन के लिए बड़ी मात्रा में संग्रह होते हैं (निष्पक्ष होने के लिए, ऐसा लगता है कि TraceChar[] ऑब्जेक्ट्स का एक टन भी उत्पन्न करता है, लेकिन यह बड़े भिन्नता को प्रदर्शित नहीं करता है log4net करता है।)

एक बात जो मैं ध्यान में रख रहा हूं वह यह है कि भले ही log4net Trace से लगभग 9 गुना धीमा लगता है, अंतर 1000 से अधिक पुनरावृत्तियों से 8ms है; यह वास्तव में एक महत्वपूर्ण प्रदर्शन नाली नहीं है। फिर भी, मेरे कुछ अपेक्षित उपयोग मामलों में कॉलिंग विधियां हो सकती हैं जो सैकड़ों हजारों बार लॉगिंग कर रही हैं, और ये संख्याएं मेरी फास्ट मशीन से हैं। एक धीमी मशीन पर हमारे उपयोगकर्ताओं की कॉन्फ़िगरेशन की अधिक विशिष्टता अंतर 170 मिमी से 11ms है जो एक छोटा और अधिक खतरनाक है।

क्या यह प्रदर्शन log4net के विशिष्ट है, या क्या ऐसे कुछ गॉथ हैं जो लॉग 4नेट के प्रदर्शन को काफी बढ़ा सकते हैं?

(नोट: मुझे पता है कि स्ट्रिंग स्वरूपण निष्पादन समय को बदल सकता है; मैं सेब से सेब की तुलना करने की कोशिश कर रहा हूं और मेरे पास प्रारूपण के साथ कोई स्वरूपण और परीक्षण मामलों के साथ परीक्षण के मामले हैं; log4net स्ट्रिंग स्वरूपण के अनुपात में आनुपातिक रूप से धीमा रहता है या प्रयोग किया जाता है नहीं)

कहानी अब तक:।

  • रॉबर्ट गोल्ड सवाल का सर्वश्रेष्ठ उत्तर है; मैं मुख्य रूप से उत्सुक था अगर यह देखने के लिए सामान्य था कि log4net Trace वर्ग से बहुत धीमा प्रदर्शन करता है।
  • एलेक्स श्नाइडर का जवाब दिलचस्प जानकारी है लेकिन वास्तव में प्रश्न के दायरे में नहीं आता है। इस लॉगिंग को शुरू करने के इरादे का आधा हिस्सा लाइव सिस्टम पर तार्किक और प्रदर्शन दोनों समस्याओं को डीबग करने में सहायता करना है; हमारे ग्राहकों ने हमारे उत्पादों को कई विदेशी परिदृश्यों में रखा है जो बिना महंगे और बड़े पैमाने पर हार्डवेयर कॉन्फ़िगरेशन के पुन: पेश करना मुश्किल होता है। मेरी मुख्य चिंता यह है कि "लॉगिंग नहीं" और "लॉगिंग" के बीच एक बड़ा समय अंतर सिस्टम को इस तरह प्रभावित कर सकता है कि बग नहीं होते हैं। अंत में, प्रदर्शन में कमी का स्तर बड़ा है लेकिन परिमाण छोटा है, इसलिए मुझे उम्मीद है कि यह कोई समस्या नहीं होगी।
+0

System.Diagnostics.Trace DebugListeners संग्रह का हिस्सा के रूप में संचालित है और इस तरह धीरे श्रोता के रूप में के रूप में तेजी से जाना होगा .. डिफ़ॉल्ट श्रोता या तो Debugger.Log को लिखते हैं (अगर यह लॉगिंग है) या सिस्टम 'OutputDebugString '। नोट: जब तक कि आपको अपने ट्रेस आउटपुट पर एकाधिक श्रोताओं को संलग्न करने की आवश्यकता न हो, Trace.WriteXX अभी भी उच्च प्रदर्शन लॉगिंग स्थितियों में उपयोग करने के लिए बहुत महंगा है। यदि आपको डीबग आउटपुट पर लिखना है तो आपको आउटपुटडिबगस्ट्रिंग फ़ंक्शन को कर्नल 32.dll पर सीधे कॉल करना चाहिए। (Trace.WriteLine से कम से कम 50% तेज) – headsling

+0

सिस्टम के v2 में TraceSource के बारे में क्या है। डायग्नोसिक्स? यह log4net की तुलना में कैसे करता है? – Eatdoku

उत्तर

12

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

नोट: मैं log4xxx क्योंकि ठीक उसी एक log4 पुस्तकालय के साथ सभी भाषाओं पर लागू होता है का उपयोग न सिर्फ नेट

4

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

+1

उत्पादन परिस्थितियों में लॉगिंग आवश्यक है! जब चीजें गलत होती हैं (जो वे सही होंगी?) लॉग अक्सर एकमात्र चीज है जिसके साथ आपको काम करना है। लॉगिंग प्रदर्शन अक्सर अनदेखा होता है जब तक कि यह आपको बम में काटने शुरू नहीं करता है। Log4Net उच्च प्रदर्शन/कम प्रभाव के साथ दिमाग में लिखा नहीं है। – headsling

1

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

6

आपको Common.Logging library में रुचि हो सकती है। यह मौजूदा लॉगिंग कार्यान्वयन पर एक पतला अमूर्त रैपर है और आपको रनटाइम पर किसी भी लॉगिंग फ्रेमवर्क को प्लग करने की अनुमति देता है। इसके अलावा यह बहुत तेज़ है तो System.Diagnostics.Trace जैसा कि मेरे blog post about performance में वर्णित है।

hth, एरिक

0

है सिर्फ एक परीक्षण एक सरल फाइल करने के लिए अनुक्रमिक लेखन की तुलना चलाने ही task.Log4Net के लिए log4net उपयोग की तुलना में है एक StreamWriter.So के बारे में 400 बार धीमी comparet मैं विचार log4net नहीं उपयोगी अगर आप विशाल लॉगफाइल पर लिख रहे हैं। लेकिन मुझे लगता है कि लॉग प्रविष्टियों की छोटी मात्रा और डिबगिंग के लिए बहुत उपयोगी है।

शायद कुछ मामलों में एक अलग थ्रेड में लॉगिंग को अलग करने का एक समाधान।

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