2010-10-05 12 views
38

लॉगिंग के लिए अपेक्षित ओवरहेड क्या होना चाहिए? मैं MAXTEST, noLogging में इस उदाहरणएनएलओजी प्रदर्शन

private class Person 
{ 
    private static Logger logger = LogManager.GetCurrentClassLogger(); 
    public string Name { get; private set; } 
    public Person(string name) 
     { 
      Name = name; 
      logger.Info("New person created with name {0}", name); 
     } 
    } 

    List<Person> people = new List<Person>(); 
    for (int i = 0; i < MAXTEST; i++) 
    { 
     people.Add(new Person(i.ToString())); 
    } 
100,500,1000 की MAXTEST मूल्यों के साथ

की कोशिश की है, 5000

परिणाम, लॉगिंग

100, 25ms, 186ms  
500, 33ms, 812ms  
1000, 33ms, 1554ms 
5000, 33ms, 7654ms 

दी एक यह अत्यधिक मात्रा में लॉग इन करने के लिए कभी नहीं शायद होगा, लेकिन यह प्रदर्शन प्रदर्शन हिट की उम्मीद होगी?

मैं भी config में asyncwrapper उपयोग करने की कोशिश की है

<target name="asyncFile" xsi:type="AsyncWrapper"> 
    <target name="file" xsi:type="File" fileName="${basedir}/log.txt" /> 
</target> 
+0

आपका लॉगर क्या कर रहा है? –

उत्तर

68

आप केवल अपने targets तत्व को async विशेषता जोड़ने की जरूरत:

<targets async="true"> 
    <target name="asyncFile" xsi:type="AsyncWrapper"> 
     <target name="file" xsi:type="File" fileName="${basedir}/log.txt" /> 
    </target> 
बजाय

<targets> 
    <target name="asyncFile" xsi:type="AsyncWrapper"> 
     <target name="file" xsi:type="File" fileName="${basedir}/log.txt" /> 
    </target> 

मुझे लगता है कि मुझे अब तक प्रलेखन में नहीं मिला ;-)

अतुल्यकालिक लक्ष्य आवरण लकड़हारा कोड और अधिक तेजी से निष्पादित करने के लिए, एक अलग थ्रेड में कतार संदेशों और प्रसंस्करण उनके द्वारा अनुमति देता है। आपको रैप लक्ष्य रखना चाहिए जो लॉगिंग को गति देने के लिए असीमित लक्ष्य के साथ उनके लिखने() विधि में एक गैर-तुच्छ समय व्यतीत करें। चूंकि एसिंक्रोनस लॉगिंग काफी आम परिदृश्य है, एनएलओजी AsyncWrapper के साथ सभी लक्ष्यों को लपेटने के लिए शॉर्टंड नोटेशन का समर्थन करता है। कॉन्फ़िगरेशन फ़ाइल में तत्व 0/पर async = "true" जोड़ें। ... आपके लक्ष्य यहां ...

ध्यान रखें कि एसिंक लॉगिंग का उपयोग करके कुछ संदेशों को त्याग दिया जा सकता है। यह by design है।

+4

इससे कितना अंतर आया? क्या आप परिणामों के अपने पहले सेट की तुलना करने के लिए समय पोस्ट कर सकते हैं? –

+24

यह लॉगिंग के साथ 5000 के लिए ~ 44ms हो गया। – Eric

+1

जानकारी के लिए धन्यवाद :) –

18

जो कोई भी इस भूमि के ऊपर कम करने के लिए की जरूरत है और कोड द्वारा विन्यस्त करने है के लिए, यह नहीं दिखता है आप डिफ़ॉल्ट रूप से अतुल्यकालिक करने के लिए सभी लक्ष्य निर्धारित कर सकते हैं जैसे - आप इसे परिभाषित करने के लिए है प्रति-लक्ष्य:

// Set up asynchronous database logging assuming dbTarget is your existing target 
AsyncTargetWrapper asyncWrapper = new AsyncTargetWrapper(dbTarget); 
config.AddTarget("async", asyncWrapper); 

// Define rules 
LoggingRule rule1 = new LoggingRule("*", LogLevel.Trace, asyncWrapper); 
config.LoggingRules.Add(rule1); 

सावधान रहें कि डिफ़ॉल्ट रूप से यदि आप बहुत अधिक लॉग आइटम कतारबद्ध करते हैं तो यह केवल आइटम छोड़ देगा - OverflowAction = AsyncTargetWrapperOverflowAction.Block पर सिंक्रोनस व्यवहार पर वापस जाने के लिए देखें।

+0

यह वही है जो मैं ओवरफ़्लोएक्शन पर सिर के लिए देख रहा था और धन्यवाद। – YetAnotherDeveloper

+2

अगर आप लॉगिंग पर बैक अप ले रहे हैं तो 'AsyncTargetWrapperOverflowAction.Block' से भी सावधान रहें, तो संभवतः आपके सिस्टम पर जोर दिया जा सकता है। ब्लॉक करने के लिए लॉगिंग को मजबूर करना आपके प्रदर्शन को और बाधित कर देगा। शायद प्रसंस्करण अनुरोधों को रोकने के बजाय लॉग संदेशों को छोड़ना बेहतर है। –

+0

मैं एक लक्षित डेटाबेस में लिख रहा हूँ। मेरे '' 'लक्ष्य'' अनुभाग में, मैंने' '' async''' को '' 'सत्य 'के रूप में चिह्नित किया है। क्या मुझे अभी भी लॉग इन एसिंक बनाने के लिए अपनी वेब सेवा में कोड लिखने की आवश्यकता है या फ्रेमवर्क इसका ख्याल रखता है? – Sameer

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