रुक-रुक कर log4net RollingFileAppender फ़ाइल समस्या को बंद कर दिया


113

हम विकास और उत्पादन मशीनों पर एक आंतरायिक मुद्दा देख रहे हैं जिससे हमारी लॉग फाइलें लॉग इन नहीं हो रही हैं।

विजुअल स्टूडियो का उपयोग करते हुए विकास और डिबगिंग में चलने पर हमें वीएस आउटपुट विंडो में निम्न लॉग 4नेट त्रुटि संदेश मिलते हैं:

log4net:ERROR [RollingFileAppender] Unable to acquire lock on file C:\folder\file.log.

प्रक्रिया 'C: \ folder \ file.log' फ़ाइल तक नहीं पहुँच सकती क्योंकि इसका उपयोग किसी अन्य प्रक्रिया द्वारा किया जा रहा है।

log4net:ERROR XmlConfigurator: Failed to find configuration section 'log4net' in the application's .config file.
Check your .config file for the <log4net> and <configSections> elements.

कॉन्फ़िगरेशन अनुभाग इस तरह दिखना चाहिए:

<section
  name="log4net"
  type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />

समस्या के लिए हमारा वर्तमान समाधान अंतिम लॉग फ़ाइल का नाम बदलना है। हम निश्चित रूप से इस असफल होने की उम्मीद करेंगे (उपरोक्त फ़ाइल लॉक के कारण), लेकिन यह सामान्य रूप से नहीं होता है। Aspnet_wp.exe प्रक्रिया से लॉक होने के कारण एक या दो बार नाम बदल गया है ।

हमारा log4net कॉन्फ़िगरेशन अनुभाग नीचे दिखाया गया है:

<log4net>
  <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="C:\folder\file.log"/>
    <appendToFile value="true" />
    <datePattern value="yyyyMMdd" />
    <rollingStyle value="Date" />
    <maximumFileSize value="10MB" />
    <maxSizeRollBackups value="100" />
    <layout type="log4net.Layout.PatternLayout">
      <header value="[Header]&#xA;"/>
      <footer value="[Footer]&#xA;"/>
      <conversionPattern value="%date %-5level %logger ${COMPUTERNAME} %property{UserHostAddress} [%property{SessionID}] - %message%newline"/>
    </layout>
  </appender>
  <root>
    <level value="INFO"/>
    <appender-ref ref="RollingLogFileAppender"/>
  </root>
</log4net>

जैसा कि उल्लेख किया गया है, हम इसे मशीनों पर रुक-रुक कर देख रहे हैं, लेकिन एक बार यह समस्या बनी रहती है।

जवाबों:


172

जोड़ने का प्रयास करें

<lockingModel प्रकार = "log4net.Appender.FileAppender + MinimalLock" />

अपने <appender />तत्व के लिए। कुछ प्रदर्शन प्रभाव है क्योंकि इसका मतलब है कि log4net फ़ाइल को लॉक कर देगा, इसे लिख देगा, और इसे प्रत्येक लिखने के ऑपरेशन के लिए अनलॉक कर देगा (जैसा कि डिफ़ॉल्ट व्यवहार के विपरीत है, जो लंबे समय तक लॉक को प्राप्त करता है और रखता है)।

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

(जब डिबगिंग, अपमानजनक समाप्ति और बहुत सारी नई कार्यकर्ता प्रक्रियाओं को स्पिन करना ठीक उसी प्रकार की चीज़ है जो होने की संभावना है।)

सौभाग्य!


मुझे बहुत सिर खुजलाया कि क्यों मेरा लकड़हारा रुक-रुक कर काम कर रहा था। मैंने कार्यकर्ता प्रक्रियाओं को ऐप पूल में जोड़ा है, डुह!
RhinoDevX64

मैं इसे एक सेवा में उपयोग कर रहा हूं और इस परिवर्तन के अलावा, उपयोगकर्ता सेवा को लिखने के लिए आवश्यक अनुमति के रूप में चलाता है। धन्यवाद!
लो टाइड

बहुत धन्यवाद, बहुत समय बचाया।
शिव

2
मैं सिर्फ फ़ाइल पढ़ना चाहता हूँ, लेकिन log4net ताले को पढ़ने के लिए भी ... यह सिर्फ लिखने और पढ़ने के लिए साझा कर सकता है
JobaDiniz

37

इसके अलावा के बारे में पता होना log4net पूछे जाने वाले प्रश्न :

मुझे एक ही फ़ाइल में लॉग इन करने के लिए कई प्रक्रिया कैसे प्राप्त करनी चाहिए?

इससे पहले कि आप प्रदान किए गए विकल्पों में से किसी को भी आज़माना शुरू कर दें, अपने आप से पूछें कि क्या वास्तव में आपको एक ही फ़ाइल में कई प्रक्रियाएँ करने की आवश्यकता है, फिर ऐसा न करें; ;-)।

FileAppender इस usecase के लिए प्लगेबल लॉकिंग मॉडल प्रदान करता है लेकिन सभी मौजूदा कार्यान्वयन में समस्याएं और कमियां हैं।

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

मिनिमलॉक केवल राइट लॉक प्राप्त करता है जबकि लॉग लिखा जा रहा है। यह कई प्रक्रियाओं को एक ही फाइल को लिखने की अनुमति देता है, जिससे प्रदर्शन में काफी नुकसान होता है।

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

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

एक बेहतर विकल्प यह है कि आपकी प्रक्रियाएँ RemotingAppenders को लॉग इन करें। RemoteLoggingServerPlugin (या IRemoteLoggingSink) का उपयोग करके एक प्रक्रिया सभी घटनाओं को प्राप्त कर सकती है और उन्हें एक लॉग फ़ाइल में लॉग इन कर सकती है। एक उदाहरण से पता चलता है कि RemoteLoggingServerPlugin का उपयोग कैसे करें।


6

यदि आपके पास है

<staticLogFileName value="true" />
<rollingStyle value="Date" />
<datePattern value="yyyyMMdd" />

और जोड़

<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />

फिर रोलिंग के दौरान कोई त्रुटि होगी। पहली प्रक्रिया नई फ़ाइल बनाएगी और वर्तमान फ़ाइल का नाम बदलेगी। फिर अगला प्रोसीस वही करेगा और नई बनाई गई फाइल को ले जाएगा और नए नाम वाली फाइल को ओवरराइट कर देगा। रिक्त होने के अंतिम दिन लॉगफिल में परिणाम।


1
यह तभी सही है जब कई प्रक्रियाएँ एक ही रोलिंग फ़ाइल तक पहुँच रही हों। यह उसी प्रक्रिया के भीतर सुरक्षित है। hectorcorrea.com/blog/log4net-thread-safe-but-not-process-safe
माइक चेम्बरलेन

@MikeChamberlain ओपी के अनुसार (जवाब देने के लिए उसकी टिप्पणी देखें), लॉग करने के लिए log4net का उपयोग करते हुए एक साथ कई श्रमिक काम करेंगे। इसलिए यह मुद्दा उचित है!
seebiscuit
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.