2009-11-13 8 views
8

का उपयोग कर एकाधिक प्रक्रियाओं से एक ही फ़ाइल में लॉगिंग करना मेरे पास कई प्रक्रियाएं एक साथ चल रही हैं जो मैं एक ही फ़ाइल में लॉग करना चाहता हूं।एंटरप्राइज़ लाइब्रेरी 4.1

हम एंटरप्राइज़ लाइब्रेरी 4.1 लॉगिंग एप्लिकेशन ब्लॉक (RollingFlatFileTraceListener के साथ) का उपयोग कर रहे हैं, और यह ठीक काम करता है, इस तथ्य के अलावा कि यह लॉग फ़ाइल नाम पर एक GUID तैयार करता है जब दो प्रक्रिया लॉग फ़ाइल पर लिखने का प्रयास करती है एक ही समय (System.Diagnostics.TextWriterTraceListener का एक quirk मुझे विश्वास है)।

मैंने लॉग फ़ाइल में लिखने के बाद Logger.Writer.Dispose() पर कॉल करने सहित विभिन्न चीजों की कोशिश की है, लेकिन प्रत्येक बार एक लॉग प्रविष्टि लिखी जा रही है, तो ब्लॉकिंग कॉल करना आदर्श नहीं है।

एंटीलिब मंच एक वितरक सेवा के साथ एमएसएमक्यू का उपयोग करने का सुझाव देते हैं, लेकिन यह एक विकल्प नहीं है क्योंकि मेरी कंपनी में एमएसएमक्यू की अनुमति नहीं है।

क्या कोई और तरीका है जो मैं एक ही फ़ाइल में एकाधिक धागे/प्रक्रियाओं से जल्दी और आसानी से लॉग कर सकता हूं?

+0

क्या आपको वैकल्पिक समाधान मिला? शायद *** एमएसएमक्यू *** का उपयोग कर? – Kiquenet

+0

@ किकनेट यह इतना लंबा समय रहा है, मुझे काफी याद नहीं है। अगर मैं वास्तव में कड़ी मेहनत करता हूं तो मुझे आश्चर्य है कि हम इस मुद्दे के आसपास काम करने के लिए विभिन्न प्रक्रियाओं के लिए विभिन्न लॉग फ़ाइलों का उपयोग कर समाप्त हो गए हैं। यह आदर्श नहीं है, लेकिन हम चीजों को सरल रखना चाहते थे। – Riko

+0

अगर मैं अब लॉगिंग फ्रेमवर्क चुनना चाहता हूं तो मैं जोड़ सकता हूं, मैं एंटरप्राइज़ लाइब्रेरी से जितना संभव हो सके रहूंगा। यह बहुत जटिल है, दोनों उपयोग और कॉन्फ़िगर करने के लिए, और आसानी से एक्स्टेंसिबल नहीं है। मैं शायद [log4net] (https://logging.apache.org/log4net/) या [NLog] (http://nlog-project.org/) के साथ जाऊंगा। – Riko

उत्तर

4

कहने के लिए खेद है, लेकिन जवाब नहीं है। फ़ाइल TraceListeners आउटपुट फ़ाइल को लॉक करते हैं, इसलिए केवल एक TraceListener फ़ाइल में लॉग ऑन कर सकता है।

आप अन्य ट्रेस श्रोताओं को आजमा सकते हैं जो फ़ाइल आधारित नहीं हैं (उदा। डेटाबेस, इवेंट लॉग)।

एक और विकल्प जो मैं सोच सकता हूं वह आपकी अपनी लॉगिंग सेवा (प्रक्रिया से बाहर) लिखना होगा जो फ़ाइल पर लॉग ऑन करेगा और लॉगइन्ट्री स्वीकार करेगा। फिर एक कस्टम ट्रेस श्रोता बनाएं जो आपकी सेवा में एक संदेश भेजता है।

यह एक अच्छा विचार नहीं हो सकता है क्योंकि आपके पास कुछ कस्टम विकास होगा और यह प्रदर्शन को प्रभावित कर सकता है क्योंकि यह प्रक्रिया कॉल से बाहर है। असल में आप अपनी खुद की सरलीकृत-छद्म-वितरक सेवा स्थापित कर रहे हैं।

+0

यह वही निष्कर्ष है जो हम भी साथ आए थे। लंबी अवधि में हम शायद लॉगिंग के लिए एक साधारण अग्नि-और-भूल डब्ल्यूसीएफ सेवा लिखेंगे, ऐसा लगता है कि यह एकमात्र अन्य व्यावहारिक विकल्प है। हालांकि दयालुता। – Riko

2

EntLib लॉग फ़ाइल को लॉक करता है जब यह लिखता है। इसलिए, 2 प्रक्रियाएं एक ही लॉग फ़ाइल में नहीं लिख सकती हैं।

जब हमें यह समस्या हो, तो हमें उसी स्थान पर कई अंतर स्थानों से लॉग इन करने की आवश्यकता थी, हमने डेटाबेस लॉगिंग का उपयोग किया है।

यदि आप टेक्स्ट फ़ाइल में 100% लॉगिंग कर रहे हैं, तो आप अलग-अलग लॉग फ़ाइलों पर लॉग इन कर सकते हैं और फिर इन फ़ाइलों को मर्ज करने के लिए एक प्रोग्राम लिख सकते हैं।

+0

एक ही प्रक्रिया में 2 अलग-अलग ट्रेस श्रोताओं को भी उसी फ़ाइल में लॉग इन नहीं किया जा सकता है। –

+0

हाँ, डेटाबेस लॉगिंग हमारे लिए एक विकल्प नहीं है, हमारे पास कोई नहीं है।फिलहाल हम वास्तव में व्यक्तिगत लॉग फाइलों के साथ जा रहे हैं कि हम एक साथ विलय करते हैं। लेकिन यह सिर्फ एक अल्पकालिक कार्यवाही होगी। – Riko

1

मुझे पता है कि यह पुराना है, लेकिन यदि आप अभी भी उत्सुक हैं। log4net इस का समर्थन करता है:

http://logging.apache.org/log4net/release/faq.html#How do I get multiple process to log to the same file?
+1

धन्यवाद। इस परियोजना पर log4net का उपयोग करना एक विकल्प नहीं था। अगर यह मेरा निर्णय था तो मैं निश्चित रूप से एंटीलिब पर इसका उपयोग करता हूं, हालांकि, एंटीलिब लॉगिंग बहुत ही फुलाया गया है और समझने में मुश्किल है। – Riko

0

समस्या तब होती है जब अनुप्रयोग पूल Recycles और ओवरलैपिंग धागे के लिए अनुमति देता है। समापन धागा अभी भी खुला है, और नया धागा त्रुटि प्राप्त करता है। आईआईएस में ओवरलैपिंग रीसाइक्लिंग व्यवहार को अक्षम करने का प्रयास करें, या टेक्स्ट लेखक का अपना संस्करण बनाएं।

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

  • कोई संबंधित समस्या नहीं^_^