2009-10-05 8 views
8

हम एक आवेदन है कि एक से अधिक थ्रेड में चलता है और प्रवेश ढांचे के रूप में log4net का उपयोग करता है। हमें एक परिदृश्य का सामना करना पड़ा जहां कुछ लॉग इवेंट लॉग नहीं किए गए थे। के रूप में डॉक्स में उल्लेख किया है, FileAppender और अन्य Appenders रहे हैं "बहु-क्रम के संचालन के लिए सुरक्षित नहीं"। मैंने समाधान या परिशिष्ट के लिए वेब की खोज की, लेकिन कोई भी नहीं मिला।
क्या आप मल्टीथ्रेड सुरक्षित लॉग 4 नेट एपेंडर जानते हैं जो मल्टीथ्रेड समर्थन प्रदान करने के लिए रिंग बफर या कतार का उपयोग करता है? या क्या हम एक अलग मल्टीथ्रेड सुरक्षित लॉगिंग ढांचे का उपयोग करना चाहिए?
अग्रिम धन्यवाद!Multithread सुरक्षित प्रवेश

+4

http://stackoverflow.com/questions/1294668 का डुप्लिकेट - मूल रूप से, log4net आपके लिए उचित रूप से एपेंडर का उपयोग करेगा। –

+0

उत्तर के लिए धन्यवाद। मैंने कुछ यूनिट परीक्षण लिखे हैं जो Log4Net मल्टीथ्रेड सुरक्षा की पुष्टि करते हैं (नीचे दिए गए उत्तर को देखें)। –

उत्तर

13

मैं कुछ इकाई परीक्षण लिखा समस्या पुन: पेश करने: एक परीक्षण 50 धागे और प्रत्येक थ्रेड लॉग 500 संदेशों बनाता है आप अपनी खुद की लॉकिंग कोड के आसपास कॉल की तरह जोड़ने की जरूरत नहीं है। बाद में लिखित रेखाओं की गणना की गई और नतीजतन मुझे विभिन्न आदेशों में 25,000 (50 x 500) लाइनें मिलीं। मैंने इसे दोहरी कोर और आठ कोर मशीन पर परीक्षण किया।

private static ILog StaticLog = log4net.LogManager.GetLogger(RepositoryName, "Static logger"); 

और परीक्षण वर्ग/धागा के प्रत्येक उदाहरण के लिए एक लॉगर के साथ:
मैं एक स्थिर लॉगर परीक्षण किया

ILog instanceLog = LogManager.GetLogger(RepositoryName, "Instance logger: " + ThreadId.ToString()); 


और सभी परीक्षणों हरे थे।

तो log4net ठीक काम करता है और अच्छी तरह से बहु सूत्रण परिदृश्यों को संभालती है। एपेंडर दस्तावेज़ों को अद्यतन किया जाना चाहिए और यह बताएं कि अगर लॉगर एपीआई सही तरीके से उपयोग किया जाता है तो बहुप्रचारित ऑपरेशंस समर्थित हैं।

मुझे लगता है कि किसी ग्राहक की मशीन पर हमें लापता लॉग प्रविष्टियों के साथ समस्या अन्य समस्याओं के कारण होती है। शायद अंतर्निहित वीएम या हार्डवेयर टूटा हुआ है।

आपकी मदद के लिए धन्यवाद!

8

मैं FileAppender उपयोग नहीं किया है और यह नहीं कह सकते, अगर यह धागा सुरक्षित है, लेकिन मैं RollingFileAppender के साथ कोई समस्या थी कभी नहीं किया है। दस्तावेज़ बताते हैं कि प्रकार के सदस्य थ्रेड सुरक्षित नहीं हैं, लेकिन यह तब तक ठीक होना चाहिए जब तक कि आप सीधे एपेंडर को लिखने का प्रयास न करें।

log.Info("message"); 
+1

हां, log4net स्वचालित रूप से लॉग कॉल लॉक करता है इसलिए यहां कोई थ्रेडिंग समस्या नहीं है। –

+0

तो आप कह रहे हैं कि Log4Net मल्टीथ्रेड सुरक्षित है अगर यह लॉगर एपीआई के माध्यम से उपयोग किया जाता है? तो मुझे लगता है कि हमारे कोड में समस्या है जो इसका उपयोग कर रहा है?
प्रत्येक कक्षा में हम इस तरह एक लॉगर बना रहे हैं:

  private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);  

लेकिन इस वर्ग का केवल एक उदाहरण थ्रेड में उपयोग किया जाता है। –

0

परीक्षण हरी मतलब यह नहीं है कि लाइनों वास्तव में फाइल करने के लिए लिखा गया था, लेकिन कोई अपवाद नहीं था कि कर रहे हैं यही कारण है कि। या आपने उस परीक्षा को शामिल किया है जो आपके परीक्षण में फ़ाइल को भी पढ़ता है? आईआईएस में वेब गार्डन पर स्विच करने के बाद मुझे एक ही समस्या का सामना करना पड़ा। उस बिंदु पर केवल एक धागा फाइल को लाइन लिख रहा था।

अधिक से अधिक थ्रेड और log4net के बारे में यहाँ: here और here

+3

वेब-गार्डन परिदृश्य का अर्थ है कि आईआईएस एकाधिक * प्रक्रियाओं * का उपयोग कर रहा है, जो एकाधिक * थ्रेड * से अलग है। FileAppender को लिखने वाले एकाधिक थ्रेड ठीक हैं; FileAppender को लिखने वाली कई प्रक्रियाएं फाइल सिस्टम के काम के कारण त्रुटियों का कारण बनती हैं। – Bleaourgh

0

log4net धागा सुरक्षित है, लेकिन appenders इस्तेमाल किया एक समस्या हो सकती। फ़ाइल एपेंडर कॉल करते समय "ब्लॉक" करते हैं। इसका मतलब है कि आपके आवेदन में, Log4Net को भेजे गए प्रत्येक लॉग को आपके एप्लिकेशन पर लौटने से पहले प्रत्येक परिशिष्ट को पूरा करना होगा।

यह धागा सुरक्षित है, कई धागे संदेशों लॉग इन करने के log4net का उपयोग कर सकते हैं, लेकिन जहां log4net appenders के लिए आवेदन प्रतीक्षा करता है कहा जाता है पूरा करने के लिए। लॉगिंग का निष्पादन समय आपके आवेदन समय में जोड़ा जाता है।

यह आसानी से साबित होता है। देखें: https://www.codeproject.com/Tips/1219696/Log-Net-Singleton-Wrapper-for-Concurrent-Logging

मैंने जो किया है वह लॉग 4नेट फ़ंक्शन को एक स्थिर सिंगलटन में "लपेटें" है जो थ्रेड-सुरक्षित है और फिर प्रत्येक लॉग संदेश को समवर्ती धागे में चलने वाली कतार में डाल दें।यह एप्लिकेशन के लिए समेकित सभी लॉगिंग करता है लेकिन एप्लिकेशन निष्पादन परिशिष्टों को पूरा करने की प्रतीक्षा नहीं करता है।

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