2012-08-22 16 views
7

लक्षण है आवेदन (आईआईएस 7 में आयोजित) जब debuging के साथ संलग्न की फांसी पाया इस तरह के ढेर के साथ ~ 100 धागे देखते हैं कि:NLog का पता लगाने में लटकी हुई है (? मुद्दा multithreading)

NLog.dll!NLog.Targets.Target.WriteAsyncLogEvent(NLog.Common.AsyncLogEventInfo logEvent) + 0x54 bytes  
NLog.dll!NLog.LoggerImpl.WriteToTargetWithFilterChain(NLog.Internal.TargetWithFilterChain targetListHead, NLog.LogEventInfo logEvent, NLog.Common.AsyncContinuation onException) + 0x8b bytes  
NLog.dll!NLog.LoggerImpl.Write(System.Type loggerType, NLog.Internal.TargetWithFilterChain targets, NLog.LogEventInfo logEvent, NLog.LogFactory factory) + 0xee bytes  
NLog.dll!NLog.Logger.WriteToTargets(NLog.LogLevel level, string message, object[] args) + 0x14 bytes  
NLog.dll!NLog.Logger.Trace<System.__Canon,long>(string message, System.__Canon argument1, long argument2) + 0x90 bytes 
... <my app code> ... 

के साथ एक कुछ
mscorlib.dll!System.Collections.Generic.Dictionary<NLog.Layouts.Layout,string>.FindEntry(NLog.Layouts.Layout key) + 0xd0 bytes 
mscorlib.dll!System.Collections.Generic.Dictionary<System.__Canon,System.__Canon>.TryGetValue(System.__Canon key, out System.__Canon value) + 0x14 bytes  
NLog.dll!NLog.Layouts.SimpleLayout.GetFormattedMessage(NLog.LogEventInfo logEvent) + 0x81 bytes 
NLog.dll!NLog.Targets.FileTarget.GetBytesToWrite(NLog.LogEventInfo logEvent) + 0x1c bytes  
NLog.dll!NLog.Targets.FileTarget.Write(NLog.Common.AsyncLogEventInfo[] logEvents) + 0x308 bytes 
NLog.dll!NLog.Targets.Target.WriteAsyncLogEvents(NLog.Common.AsyncLogEventInfo[] logEvents) + 0x258 bytes  
NLog.dll!NLog.Targets.Wrappers.AsyncTargetWrapper.ProcessPendingEvents(object state) + 0x1e6 bytes 
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool ignoreSyncCtx) + 0xdc bytes  
mscorlib.dll!System.Threading._TimerCallback.PerformTimerCallback(object state) + 0x97 bytes  
... <my app code> ... 

और

mscorlib.dll!System.Collections.Generic.Dictionary<NLog.Layouts.Layout,string>.Insert(NLog.Layouts.Layout key, string value, bool add) + 0x1e0 bytes  
NLog.dll!NLog.LogEventInfo.AddCachedLayoutValue(NLog.Layouts.Layout layout, string value) + 0x6c bytes 
NLog.dll!NLog.Layouts.Log4JXmlEventLayout.GetFormattedMessage(NLog.LogEventInfo logEvent) + 0xf5 bytes 
NLog.dll!NLog.Targets.Target.PrecalculateVolatileLayouts(NLog.LogEventInfo logEvent) + 0xb8 bytes  
NLog.dll!NLog.Targets.Wrappers.AsyncTargetWrapper.Write(NLog.Common.AsyncLogEventInfo logEvent) + 0x23 bytes  
NLog.dll!NLog.Targets.Target.WriteAsyncLogEvent(NLog.Common.AsyncLogEventInfo logEvent) + 0x151 bytes  
NLog.dll!NLog.LoggerImpl.WriteToTargetWithFilterChain(NLog.Internal.TargetWithFilterChain targetListHead, NLog.LogEventInfo logEvent, NLog.Common.AsyncContinuation onException) + 0x8b bytes  
NLog.dll!NLog.LoggerImpl.Write(System.Type loggerType, NLog.Internal.TargetWithFilterChain targets, NLog.LogEventInfo logEvent, NLog.LogFactory factory) + 0xee bytes  
NLog.dll!NLog.Logger.WriteToTargets(NLog.LogLevel level, string message, object[] args) + 0x14 bytes  
NLog.dll!NLog.Logger.Debug<Werp.Controller.Common.Interfaces.EntityEventAction,System.__Canon>(string message, Werp.Controller.Common.Interfaces.EntityEventAction argument1, System.__Canon argument2) + 0x8d bytes  
... <my app code> ... 

के साथ एक यह स्थिति तब होती है कई बार एक सप्ताह में एक बार हो सकता है, और मेरे पास इसे पुन: पेश करने के लिए exac परिदृश्य नहीं है।

मैं इसे कैसे ठीक कर सकता हूं? क्या यह एनएलओजी में बग है, या शायद मेरे कुछ दुरुपयोग या गलत कॉन्फ़िगरेशन?

उत्तर

1

Dictionary<T> सुरक्षित थ्रेड नहीं है, इसलिए एक से अधिक थ्रेड में उस तक पहुंचने में इस तरह की समस्याओं को जन्म दे सकता है,

http://msdn.microsoft.com/en-us/library/xfhwa508.aspx

http://blogs.msdn.com/b/asiatech/archive/2009/05/11/100-cpu-caused-by-system-collections-generic-dictionary.aspx

यह बताने के लिए आप बहु सूत्रण में काम करने के NLog कॉन्फ़िगर कर सकते हैं कि क्या मुश्किल है । क्या आपने इसके AsyncWrapper का उपयोग करने का प्रयास किया था?

http://nlog-project.org/wiki/AsyncWrapper_target

NLog मंच के अनुसार, async तरीका का उपयोग कर समस्या का समाधान करना चाहिए,

http://nlog-forum.1685105.n2.nabble.com/Multi-Threading-in-NLog-td3728834.html

+0

भाग लेने के लिए धन्यवाद, मेरी कॉन्फ़िगरेशन में पहले से ही है जो एसिंक रैपर – pil0t

+0

के लिए शॉर्टकट है, फिर डेवलपर्स को ठीक करना चाहिए। क्या आप इस मुद्दे की रिपोर्ट करने के लिए http://nlog.codeplex.com/workitem/list/basic पर गए थे? –

1

मैं हाल ही में एक ही समस्या का सामना करना पड़ा - धागे WriteAsyncLogEvent पर अवरुद्ध के बहुत सारे। हालांकि मेरे पास Dictionary धागे नहीं थे। मेरे पास AsyncRequestQueue.Enqueue में एक थ्रेड फंस गया था, जिसे आपने अपनी थ्रेड सूची में याद किया होगा।

मेरे मामले में, समस्या यह थी कि overflowActionAsyncWrapper पर सेट किया गया था ... Block! इसे Discard पर सेट करना ओवरलोडेड लॉगर से निपटने का बहुत बुद्धिमान तरीका है।

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

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