2010-04-06 10 views

उत्तर

10

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

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

10

यह FileAppender के LockingModel पर निर्भर करता है। यदि यह ExclusiveLock है तो दूसरी प्रक्रिया लेखन के लिए फ़ाइल नहीं खोल सकती है। विकल्प MinimalLock है, लेकिन यह इस उद्देश्य के लिए नहीं है। यह एक और प्रक्रिया को फ़ाइल को स्थानांतरित या हटाने की अनुमति देने के लिए है।

+0

क्या किसी को इस विधि के बारे में साझा करने का अनुभव है? – SandRock

17

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

अन्य विकल्पों में रिमोट लॉगर शामिल है, जहां आपके पास अन्य प्रक्रियाओं द्वारा भेजे गए लॉगिंग ईवेंट प्राप्त करने और रिकॉर्ड करने के लिए एक सरल सर्वर स्थापित है। इसी तरह, आप एक SQL डेटाबेस में लॉग कर सकते हैं। मैंने एक सरल जोड़ा जो रेडिस को लॉग करता है; आपको रेडिस से पढ़ने और फ़ाइल में रिकॉर्ड करने के लिए एक साधारण एप्लिकेशन की आवश्यकता होगी। इन दृष्टिकोणों के साथ समस्या यह है कि वे सभी विफलता का एक बिंदु पेश करते हैं। जब कुछ सही काम नहीं कर रहा होता है तो अक्सर आपको लॉग की आवश्यकता होती है, और फिर वे उपलब्ध नहीं हो सकते हैं।

तो मेरी समाधान अपने आप ही फाइल करने के लिए प्रत्येक प्रक्रिया लॉग होने से पूरी तरह समस्या से बचने के थे। कॉन्फ़िगरेशन में बदलाव के साथ यह करना आसान था। अपने (Rolling)FileAppender विन्यास में, का उपयोग करें:

<file type="log4net.Util.PatternString" value="c:\mylog-[%processid].txt" /> 

प्रक्रिया आईडी फ़ाइल नाम का हिस्सा बन जाता। हां, इसका मतलब है कि अब आपके पास कंघी करने के लिए कई लॉग फाइलें हैं, लेकिन ग्रे लॉग, स्प्लंक, या लॉगस्केप जैसे लॉग फ़ाइल एग्रीगेटर मदद कर सकते हैं।

1

या आप सामान्य संसाधन को लॉक करने के लिए म्यूटेक्स का उपयोग कर सकते हैं और इसलिए विभिन्न प्रक्रियाओं से सामान्य लॉग फ़ाइल तक पहुंच को सिंक्रनाइज़ करने के लिए उपयोग कर सकते हैं।

0

हाँ, यह के रूप में ऊपर कहा गया है, लेकिन मैं अब इस परिदृश्य में से कुछ तनाव परीक्षण किया है संभव है।

सेटअप काफी सरल है:

  1. वेब परियोजना 1 कि URL में एक ही प्रविष्टि + एक काउंटर के साथ एक बटन कि बंद एक ही पृष्ठ के लिए 1000 अनुरोध सेट, लॉग एक पेज के साथ सेट अप (लॉगिंग कथन द्वारा उठाया गया)।
  2. वेब प्रोजेक्ट 2 समान लॉग फ़ाइल के विरुद्ध समान रूप से सेट अप किया गया है।

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

तो, इस सामान्य लॉग के खिलाफ सभ्य यातायात के साथ, आपको मूल रूप से लॉग इन स्टेटमेंट लॉग में समाप्त होने की कोई गारंटी नहीं होगी। निष्कर्ष हमेशा परियोजना विशिष्ट लॉग फ़ाइलों के लिए है, ऐसा लगता है।

परीक्षण "मिनीमलॉक" के डिफ़ॉल्ट के साथ किया गया था। मैंने परीक्षण को "एक्सक्लूसिव लॉक" के साथ भी रेडिड किया है, केवल यह पता लगाने के लिए कि लॉगर को "जीता" कॉन्फ़िगर करने वाला पहला वेब प्रोजेक्ट, मूल रूप से लॉग इन करने के लिए अन्य सभी अनुरोधों को लॉक कर रहा है। तो जाहिर है, यह भी नहीं है।

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