2013-06-14 6 views
16

पर लिखने के लिए log4net का उपयोग करके मैं लॉगिंग करने के लिए log4net का उपयोग कर रहा हूं। मैं इसे एक फ़ाइल में और एक ही समय में इवेंट लॉग में लिखना चाहता हूं।विभिन्न लॉगर्स

किसी कारण से, मुझे अपने लॉगफाइल में संदेश दो बार मिलते हैं।

<log4net> 
    <root> 
     <level value="INFO" /> 
     <appender-ref ref="LogFileAppender" /> 
     <appender-ref ref="EventLogAppender" /> 
    </root> 
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" > 
     <param name="File" value="c:\temp\DIS-logfile.txt" /> 
     <param name="AppendToFile" value="true" /> 
     <rollingStyle value="Size" /> 
     <maxSizeRollBackups value="10" /> 
     <maximumFileSize value="10MB" /> 
     <staticLogFileName value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <param name="ConversionPattern" value="%date %-5level %logger - %message%newline" /> 
     </layout> 
    </appender> 
    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender"> 
     <param name="Indigo.DataIntakeService" value="eventlog" /> 
      <layout type="log4net.Layout.PatternLayout"> 
       <conversionPattern value="%date %-5level %logger - %message%newline" /> 
      </layout> 
    </appender> 
</log4net> 

मेरी कोड में मैं निम्नलिखित टीओएफ है:

यह मेरी app.config अनुभाग है

private static readonly ILog Log = log4net.LogManager.GetLogger("DataIntakeService"); 
     private static readonly ILog LogEvents = log4net.LogManager.GetLogger("EventLogAppender"); 

     static void Main(string[] args) 
     { 
      log4net.Config.XmlConfigurator.Configure(); 
     } 

     public static void LogInfo(string message) 
     { 
      Log.Info(message); 
      LogEvents.Info(message); 
     } 

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

मैं गलत कहां गया?

उत्तर

24

आपने Log4Net को कॉन्फ़िगर किया है ताकि रूट लॉगर फ़ाइल और ईवेंट लॉग एपेंडर्स दोनों को लॉग कर सके। सभी लॉगर्स इस कॉन्फ़िगरेशन का उत्तराधिकारी हैं, इसलिए आपके लॉगर्स "DataIntakeService" और "EventLogAppender" दोनों इन परिशिष्टों को लॉग इन करते हैं।

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

अद्यतन

कैसे मैं इसे कॉन्फ़िगर कर सकते हैं फ़ाइल और eventviewer को एक दूसरे के लिए इतना DataIntakeService लॉग?

<log4net> 
    <root> 
    <level value="INFO" /> 
    <appender-ref ref="LogFileAppender" /> 
    </root> 
    <logger name="EventLogAppender" additivity="False"> 
    <level value="INFO" /> 
    <appender-ref ref="EventLogAppender" /> 
    </logger> 
    <appender> 
    ... 
इस नमूने के साथ

:

  • जड़ लकड़हारा (और इसलिए सभी बच्चे वालों जब तक स्पष्ट अन्यथा कॉन्फ़िगर) LogFileAppender को प्रवेश करेंगे

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

  • EventLogAppender लकड़हारा स्पष्ट EventLogAppender को लॉग इन करने के लिए कॉन्फ़िगर किया गया है, और माता पिता वालों (additivity="false") से सेटिंग इनहेरिट करने के लिए नहीं किया गया है। इसलिए यह LogFileAppender पर लॉग इन नहीं करता है। यदि आप additivity="true" सेट करते हैं तो यह सेटिंग प्राप्त करेगा और LogFileAppender और EventLogAppender दोनों पर लॉग इन करेगा।

  • संयोग से, एक लकड़हारा EventLogAppender नामकरण शायद थोड़ा भ्रामक है: EventLogLogger एक बेहतर नाम हो सकता है।

    +1

    कैसे मैं इसे फ़ाइल और eventviewer को एक दूसरे के लिए कॉन्फ़िगर कर सकते हैं ताकि DataIntakeService लॉग? –

    +1

    यह एक अच्छा स्पष्टीकरण धन्यवाद है। बस स्पष्ट करने के लिए, यदि 'additivity' निर्दिष्ट नहीं है तो डिफ़ॉल्ट' सत्य 'है, सही है? – Ben

    +1

    @ बेन, हां, addivity डिफ़ॉल्ट पर डिफ़ॉल्ट है: https://logging.apache.org/log4net/release/sdk/log4net.Repository.Hierarchy.Logger.Additivity.html – Joe

    7

    आप नीचे कॉन्फ़िगरेशन द्वारा विभिन्न लॉगर्स को लिखने के लिए log4net का उपयोग कर सकते हैं।

    <log4net> 
    <logger name="LogFileLogger"> 
        <level value="INFO" /> 
        <appender-ref ref="LogFileAppender" /> 
    </logger> 
    <logger name="EventLogger"> 
        <level value="INFO" /> 
        <appender-ref ref="EventLogAppender" /> 
    </logger> 
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender"> 
        ... 
    </appender> 
    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender"> 
        ... 
    </appender> 
    

    और आप के रूप में वालों कॉल कर सकते हैं:

    private static readonly log4net.ILog LogFileLogger= log4net.LogManager.GetLogger("LogFileLogger"); 
    private static readonly log4net.ILog EventLogger= log4net.LogManager.GetLogger("EventLogger"); 
    
    संबंधित मुद्दे