संपादित करें 2: मैं इस समस्या का समाधान कर लिया (नीचे का जवाब देखें) कृपया ध्यान दें कि समस्या संभवतः सभी appenders BufferingForwardingAppender के साथ-साथ BufferingAppenderSkeleton (क्रमशः से इनहेरिट सभी appenders के साथ सजाया प्रभावित करता है: AdoNetAppender, RemotingAppender, SmtpAppender और SmtpPickupDirAppender) *log4net BufferingForwardingAppender प्रदर्शन मुद्दा
मैं लॉग 4नेट के कुछ बहुत ही बुनियादी खंड बना रहा था और मैंने एक रोलिंगफाइलएपेंडर को एक बफरिंगफॉरवर्डिंग एपेंडर के साथ सजाने की कोशिश की।
मुझे रोलिंगफाइलएपेंडर के माध्यम से सीधे BufferingForwardingAppender के माध्यम से भयानक प्रदर्शन का अनुभव होता है और मुझे वास्तव में कारण नहीं मिलता है। यहाँ
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="c:\" />
<appendToFile value="false" />
<rollingStyle value="Composite" />
<datePattern value="'.'MMdd-HH'.log'" />
<maxSizeRollBackups value="168" />
<staticLogFileName value="false" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<appender name="BufferingForwardingAppender" type="log4net.Appender.BufferingForwardingAppender">
<bufferSize value="512" />
<appender-ref ref="RollingLogFileAppender" />
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="BufferingForwardingAppender" />
</root>
और बेंचमार्क (बहुत ही सरल कोड) है:
यहाँ मेरी विन्यास है
var stopWatch = new Stopwatch();
stopWatch.Start();
for (int i = 0; i < 100000; i++)
{
Log.Debug("Hello");
}
stopWatch.Stop();
Console.WriteLine("Done in {0} ms", stopWatch.ElapsedMilliseconds);
RollingFileAppender के माध्यम से सीधे उत्पादन हो रहा है:
में किया 511 एमएस
BufferingForwardingAppender सजाने RollingFileAppender माध्यम से जा रहा जबकि:
14261 एमएस
लगभग है 30 बार धीमी है कि में हो गया।
मैंने सोचा कि मुझे फ़ाइल में लिखने से पहले लॉग की एक निश्चित राशि बफर करके कुछ गति प्राप्त होगी, हालांकि किसी कारण से यह चीजों को और भी बदतर हो जाता है।
मुझे लगता है कि कॉन्फ़िगरेशन ठीक है, इसलिए यह वास्तव में अजीब है।
किसी को भी एक सुराग मिला?
धन्यवाद!
संपादित करें 1:
व्यवहार सख्ती से लपेटकर/एक FileAppender या यहाँ तक कि सजा ConsoleAppender द्वारा एक ही है (अभी भी वहाँ log4net आधिकारिक config नमूनों में बुनियादी BufferingForwardingAppender रैपिंग/सजाने ConsoleAppender का एक उदाहरण है .. और कुछ भी नहीं प्रदर्शन के साथ विशिष्ट उल्लिखित व्यवहार)।
कुछ जांच/प्रोफाइलिंग के बाद, मैं देख सकता हूं कि अधिकतर समय BufferingForwardingAppender के अंदर WindowsIdentity.GetCurrent() को कॉल में खराब कर दिया गया है ... हर बार कहा जा रहा है हम Log.Debug()
पर कॉल करते हैं .. पिछले नमूने में (उपरोक्त नमूना स्रोत में 100K बार)।
इस विधि को कॉल बहुत महंगा माना जाता है और इसे टाला जाना चाहिए या कम किया जाना चाहिए, मुझे वास्तव में यह नहीं मिलता है कि यह प्रत्येक लॉग इवेंट के लिए क्यों बुलाया जाता है। क्या मैं वास्तव में कुछ स्पष्ट रूप से गलत कॉन्फ़िगर कर रहा हूं/कुछ स्पष्ट नहीं देख रहा हूं, या यह कि किसी भी तरह से एक बग है, यही वह है जिसे मैं अभी समझने की कोशिश कर रहा हूं ...
आंशिक कॉल स्टैक है:
- AppenderSkeleton.DoAppend
- BufferingAppenderSkeleton.Append
- LoggingEvent.FixVolatileData
- LoggingEvent.get_UserName()
get_LocationInformation()
को एक कॉल है फिक्सवोलाटाइलडाटा में भी किया गया, जिसमें एक उच्च perf लागत भी शामिल है (एस को कैप्चर करें प्रत्येक बार ट्रेस ट्रेस)।
अब मैं यह समझने की कोशिश कर रहा हूं कि यह अत्यंत महंगी FixVolatileData कॉल (कम से कम ठीक से पूछे जाने वाले प्रश्न के लिए) इस संदर्भ में प्रत्येक लॉग इवेंट के लिए होता है जबकि सीधे लपेटा हुआ एपेंडर (सीधे ConsoleAppender/FileAppender .. के माध्यम से) के माध्यम से जाता है। इस तरह के ऑपरेशन करते हैं।
आगामी अद्यतन का पालन करने, जब तक कि कोई इस सब के लिए एक जवाब मिला,)
धन्यवाद!
नमस्ते, हमें प्रवेश कर रहे हैं धागा, अपवाद और एक कस्टम फ़ील्ड आईडी के साथ जल्द ही मेरे सवाल का जवाब देंगे। हम log4net.Appender.AdoNetAppender का उपयोग कर रहे हैं। हम निर्दिष्ट करने के लिए कोशिश की और परिणाम यह धागा और अपवाद के प्रवेश मूल्यों रोक दिया गया। इसके अलावा कस्टम आईडी फ़ील्ड गलत तरीके से लॉगिंग शुरू कर दिया गया था। हालांकि प्रदर्शन लगभग 10 गुना सुधार हुआ। क्या आप कोई सुराग दे सकते हैं? –
AdoNetAppender के लिए क्या आप वाकई उन चीजों ठीक करने की जरूरत है। http://logging.apache.org/log4net/release/sdk/log4net.Core.FixFlags.html –
समाधान के लिए धन्यवाद: बातें आप इस संदर्भ दस्तावेज में तय की जरूरत के मूल्य जोड़ें! तो _final_ संख्या होगी 'RollingFileAppender': 511 एमएस बनाम 230 एमएस या 350 एमएस (config के आधार पर)' BufferingForwardingAppender' के लिए? निश्चित रूप से एक सुधार, लेकिन जैसा कि मैंने सोचा था उतना प्रभावशाली नहीं ... – Josep