2010-09-15 17 views
5

रोल करने के लिए सेट है DatePattern स्ट्रिंग को कुछ ऐसा होना चाहिए जो SimpleDateFormatterwill accept हो।एक लॉग 4Net RollingFileAppender को साप्ताहिक

दुर्भाग्यवश इसका मतलब है कि, बॉक्स के बाहर, इसमें सीमा को सप्ताह की संख्या निर्धारित करने में सक्षम नहीं है। इस मान को सी # में प्राप्त करने के तरीके हैं, लेकिन यह स्पष्ट नहीं है कि हम SimpleDateFormatter का विस्तार कर सकते हैं या IDateFormatter का एक अलग कार्यान्वयन प्रदान कर सकते हैं और इसके बजाय (या कस्टम RollingFileAppender में भी) का उपयोग कर सकते हैं।

तो हम साप्ताहिक रोल करने के लिए लॉग 4Net RollingFileAppender कैसे प्राप्त कर सकते हैं?

उत्तर

1

यह इतना आसान नहीं है। "रोल पॉइंट" निर्धारित करने के लिए RollingFileAppender DateTime.ToString() का उपयोग करता है। लॉग 4नेट सहायता का बयान गलत नहीं है क्योंकि SimpleDateFormatter इस विधि का भी उपयोग करता है लेकिन यह कुछ हद तक भ्रामक है: रोलिंग फ़ाइल एपेंडर जिस तरह से आप चाहते हैं उसे काम करने के लिए आप एक अलग डेट फॉर्मेटर इंजेक्ट नहीं कर सकते हैं।

यदि आपको वास्तव में सप्ताह की सुविधा के अनुसार रोल की आवश्यकता है तो सबसे आसान तरीका RollingFileAppender से प्राप्त करना होगा और AdjustFileBeforeAppend() विधि को ओवरराइड करना होगा। इसका परीक्षण नहीं किया, लेकिन यह चाल चलनी चाहिए।

2

मुझे हर सप्ताह मेरा रोलिंग मिल गया। अद्वितीय फ़ाइल नाम उत्पन्न करने के लिए आपको महीने के दिन को शामिल करने के लिए अपना डेटफॉर्मेट सेट करना होगा।

class RollingOverWeekFileAppender : RollingFileAppender 
{ 
    private DateTime nextWeekendDate; 

    public RollingOverWeekFileAppender() 
    { 
     CalcNextWeekend(DateTime.Now); 
    } 

    private void CalcNextWeekend(DateTime time) 
    { 
     // Calc next sunday 
     time = time.AddMilliseconds((double)-time.Millisecond); 
     time = time.AddSeconds((double)-time.Second); 
     time = time.AddMinutes((double)-time.Minute); 
     time = time.AddHours((double)-time.Hour); 
     nextWeekendDate = time.AddDays((double)(7 - (int)time.DayOfWeek)); 
    } 

    protected override void AdjustFileBeforeAppend() 
    { 
     DateTime now = DateTime.Now; 

     if (now >= nextWeekendDate) 
     { 
      CalcNextWeekend(now); 
      // As you included the day and month AdjustFileBeforeAppend takes care of creating 
      // new file with the new name 
      base.AdjustFileBeforeAppend(); 
     } 
    } 
} 
1

मैं भी प्रवेश फ़ाइल साप्ताहिक रोल करने GLM के समाधान की विधि के परीक्षण से ही समस्या का सामना, किसी भी तरह यह log4net के संस्करण (1.2.15.0) पर काम नहीं कर रहा है, लेकिन उनके जवाब से प्रेरित,

namespace log4net.Appender 
{ 
    class RollingOverWeekFileAppender : RollingFileAppender 
    { 
     public RollingOverWeekFileAppender() 
     { 
      IDateTime dt = new SundayDateTime(); 
      DateTimeStrategy = dt; 
     } 

     class SundayDateTime : IDateTime 
     { 
      public DateTime Now 
      { 
       get { return CalcThisSunday(DateTime.Now); } 
      } 

      private DateTime CalcThisSunday(DateTime time) 
      { 
       // Calc this sunday 
       time = time.AddMilliseconds((double)-time.Millisecond); 
       time = time.AddSeconds((double)-time.Second); 
       time = time.AddMinutes((double)-time.Minute); 
       time = time.AddHours((double)-time.Hour); 
       return time.AddDays((double)(-(int)time.DayOfWeek)); 
      } 
     } 
    } 
} 

और log.config की मेरी टुकड़ा (रविवार की तारीख के रूप में नामित) और स्रोत कोड का अध्ययन, मैं एक समाधान प्रति सप्ताह नाम से लॉग फ़ाइल उत्पन्न करने के लिए बना दिया है

<appender name="Log" type="log4net.Appender.RollingOverWeekFileAppender"> 
    <file type="log4net.Util.PatternString"> 
    <conversionPattern value=".\log-" /> 
    </file> 
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/> 
    <encoding value="utf-8" /> 
    <staticLogFileName value="false"/> 
    <appendToFile value="true" /> 
    <rollingStyle value="Date"/> 
    <datePattern value="yyyyMMdd.lo\g"/> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%date&#9;%level&#9;%logger{1}&#9;%message%newline" /> 
    </layout> 
</appender>