2013-02-19 96 views
14

के साथ आईओ बफर को फ्लश नहीं कर रहा है, मैं same issue as HENRI COOK did पर विचार कर रहा हूं। इसे bug on Apache Jira के रूप में रिपोर्ट किया गया है जहां तक ​​हम संक्षिप्त विवरण से बता सकते हैं।Log4Net RollingFileAppender कम वॉल्यूम लॉग

सार में मेरी समस्या यह है कि एप्लिकेशन बंद होने पर ईवेंट केवल लॉग होते हैं (ईवेंट के बाद भी सप्ताह)। ऐसा तब होता है जब लॉगिंग वॉल्यूम बहुत कम होता है। मैं इसे विंडोज सर्वर 2008 आर 2 पर देख रहा हूं। यह हमें उत्पादन त्रुटियों को कैप्चर करने और प्रतिक्रिया करने से रोकता है।

अब एपेंडर एक बफरिंग नहीं है। डिफ़ॉल्ट रूप से यह प्रत्येक बार एक संदेश संलग्न होने पर अंतर्निहित स्ट्रीम पर फ्लश() को भी कॉल करता है।

मेरा सवाल यह है कि यह क्यों नहीं चल रहा है? और programatically flushing all appenders के अलावा कोई उपाय है? क्या आप pulsing appender पर एक व्यवहार्य कामकाज पर विचार करेंगे?

appender config:

<appender name="RollingErrorFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <param name="File" value="D:\LogFiles\zzzz\xxxxxx__ERROR" /> 
    <param name="AppendToFile" value="true" /> 
    <param name="DatePattern" value="_yyyyMMddHH&quot;.log&quot;" /> 
    <param name="RollingStyle" value="Date" /> 
    <param name="StaticLogFileName" value="false" /> 
    <filter type="log4net.Filter.LevelRangeFilter"> 
    <param name="LevelMin" value="ERROR" /> 
    <param name="LevelMax" value="FATAL" /> 
    </filter> 
    <layout type="log4net.Layout.PatternLayout"> 
    <param name="ConversionPattern" value="%utcdate{yyyy-MM-dd HH:mm:ss.fff},[%thread],%level,%logger,%m%n"/> 
    </layout> 
</appender> 

अद्यतन 2013-06-19

मैं किसी भी कोड के साथ व्यवहार पुन: पेश करने में सक्षम नहीं किया गया। कोई फर्क नहीं पड़ता कि मैं कितना बुरा प्रयास करता हूं, डेटा हमेशा डिस्क पर हमेशा लिखा जाता है। हालांकि, एक महत्वपूर्ण अवलोकन किया गया था: यदि फ़ाइल को पहली बार लिखना 1KiB से बड़ा है, तो संशोधित समय को बाद के लेखनों के साथ कभी अपडेट नहीं किया जाता है। यह केवल तभी अपडेट किया जाएगा जब फ़ाइल बंद होने के समय बंद हो। यदि दूसरी तरफ पहला लिखना एक छोटा-लाइनर है, तो कोई भी बाद में लिखने वाले संशोधित समय को अपडेट किया जाएगा। यह व्यवहार लॉग 4नेट और मैनुअल आईओ ऑपरेशन के बीच, 32 बिट WinXP और 64 बिट W2k8R2 के बीच, .NET 2.0, 3.5 और .NET 4.0 के बीच संगत है। यह अभी भी समस्या का समाधान नहीं करता है, लेकिन कम से कम मैं अब अजीब संशोधन-समय पैटर्न को समझ सकता हूं।

धन्यवाद, रोब

+0

आप appender प्रयोग कर रहे हैं के लिए config पोस्ट कर सकते हैं:

class Program { static void Main(string[] args) { ILog log = LogManager.GetLogger(typeof(Program)); XmlConfigurator.Configure(new FileInfo(@"C:\temp\logTest.config")); string msg; while ((msg = Console.ReadLine()) != "Done") { log.Error(msg); } LogManager.Shutdown(); } } 

logTest.config मुख्य prog द्वारा संदर्भित? –

+0

@AdamS, config जोड़ा गया, धन्यवाद – Rbjz

+0

और स्पष्टीकरण के लिए, क्या आप उस अवधि के दौरान कम से कम एक ERROR स्तर या उच्च लॉगिंग ईवेंट होने पर हर घंटे लॉग रोल नहीं देख रहे हैं?मैंने आपके एपेंडर के साथ परीक्षण किया और लॉग फ्लश और ठीक से रोल देखा। –

उत्तर

25

के बाद से आप केवल त्रुटि स्तर या बुरा लॉग ईवेंट को लेकर चिंतित हैं, और कहा कि यातायात सौभाग्य से निराला है, मैं तुरंत फ्लश करने के लिए अपने appender को विन्यस्त सुझाव है।

<param name="ImmediateFlush" value="true" /> 

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

संपादित

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

बेसिक मुख्य prog:

<log4net> 
    <appender name="RollingErrorFileAppender" type="log4net.Appender.RollingFileAppender"> 
     <param name="File" value="C:\temp\log" /> 
     <param name="AppendToFile" value="true" /> 
     <param name="DatePattern" value="_yyyyMMddHH&quot;.log&quot;" /> 
     <param name="RollingStyle" value="Date" /> 
     <param name="StaticLogFileName" value="false" /> 
     <param name="ImmediateFlush" value="true" /> 
     <filter type="log4net.Filter.LevelRangeFilter"> 
      <param name="LevelMin" value="ERROR" /> 
      <param name="LevelMax" value="FATAL" /> 
     </filter> 
     <layout type="log4net.Layout.PatternLayout"> 
      <param name="ConversionPattern" value="%utcdate{yyyy-MM-dd HH:mm:ss.fff},[%thread],%level,%logger,%m%n"/> 
     </layout> 
    </appender> 
    <root> 
     <level value="INFO" /> 
     <appender-ref ref="RollingErrorFileAppender" /> 
    </root> 
</log4net> 
+1

धन्यवाद @ एडम, हालांकि मुझे असहमत होने की हिम्मत है। यदि आप 'निजी बूल m_immediateFlush = true' के कोड पर देखते हैं, और 'v1.2.10 TextWriterAppender] में सुरक्षित शून्य अपेंड (लॉगिंगवेवेंट लॉगिंगइवेंट) को ओवरराइड करें (http://svn.apache.org/viewvc/logging/log4net/ टैग/log4net-1.2.10/src/appender/TextWriterAppender.cs? view = markup), आप मुझसे सहमत होंगे कि तत्काल फ्लैश डिफ़ॉल्ट रूप से सत्य है और इसलिए एपेंडर वास्तव में प्रत्येक परिशिष्ट() पर फ्लश() को कॉल करता है क्योंकि मैं पहले से ही क्यू – Rbjz

+1

में कहा गया मैंने परीक्षण परीक्षा के साथ अपना जवाब संपादित किया। इसके साथ मैं तुरंत घटनाओं को देख सकते हैं। क्या आप एक ही व्यवहार नहीं देखते हैं? –

+0

धन्यवाद एडम, यह एक अच्छा विचार है। मैं कल उम्मीद करूँगा। – Rbjz