25

मैंने डुप्लिकेट के लिए कड़ी मेहनत की है लेकिन इसे एक बार पूछना चाहिए, इससे कोई फर्क नहीं पड़ता कि यह एक बार और सभी के लिए स्पष्ट हो सकता है!log4net प्रारंभिकरण

एक ताजा कंसोल ऐप्लिकेशन में पर 64 बिट W7 VS28KSP1 पर log4net संस्करण 1.2.10.0 का उपयोग कर, मैं निम्नलिखित कोड: -

using log4net; 
using log4net.Config; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static readonly ILog _log = LogManager.GetLogger(typeof(Program)); 
     static void Main(string[] args) 
     { 
      _log.Info("Ran"); 
     } 
    } 
} 

मेरी app.config में, मेरे पास है:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 
    </configSections> 
    <log4net> 
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> 
     <file value="Program.log" /> 
     <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
     <appendToFile value="true" /> 
     <rollingStyle value="Size" /> 
     <maxSizeRollBackups value="10" /> 
     <maximumFileSize value="1MB" /> 
     <staticLogFileName value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="[%username] %date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
     </layout> 
    </appender> 

    <root> 
     <level value="DEBUG" /> 
     <appender-ref ref="RollingFileAppender" /> 
    </root> 
    </log4net> 

</configuration> 

यह कुछ भी नहीं लिखता है, जब तक कि मैं या तो कोई विशेषता नहीं जोड़ता:

[ assembly:XmlConfigurator ] 

या स्पष्ट रूप से मुख्य() में यह itialise:

_log.Info("This will not go to the log"); 
XmlConfigurator.Configure(); 
_log.Info("Ran"); 

यह निम्नलिखित प्रश्न उठाता है:

  1. मैं लगभग निश्चित है कि मैं इसे विधानसभा विशेषता के अलावा बिना log4net के कुछ संस्करण पर कहीं काम कर देखा है हूँ या मुख्य में कॉल करें। क्या कोई मुझे आश्वस्त कर सकता है कि मैं कल्पना नहीं कर रहा हूं?
  2. क्या कोई मुझे बता सकता है कि डॉक्टर में कहां स्पष्ट रूप से कहता है कि कॉन्फ़िगरेशन अनुभाग और प्रारंभिक हुक दोनों की आवश्यकता है - उम्मीद है कि यह कब बदला गया है, अगर यह बदल गया है?

मैं आसानी से कल्पना कर सकते हैं क्यों इस नीति हो सकती है - initialisation कदम आश्चर्य से बचने के लिए आदि स्पष्ट हो रही है, यह सिर्फ है कि मैं याद करने के लिए हमेशा बात यही नहीं जा रहा है ... (और सामान्य रूप से मेरे पास है लगते है जो आम तौर पर तस्वीर से बाहर configSections लेता है एक अलग फाइल में config,)

उत्तर

27

the configuration page in the manual के अनुसार:

log4net विन्यास विधानसभा स्तरीय का उपयोग कर विन्यस्त किया जा सकता विशेषताओं के बजाय प्रोग्राम के रूप में निर्दिष्ट।

XmlConfiguratorAttribute: log4net.Config.XmlConfiguratorAttribute की अनुमति देता है XmlConfigurator निम्नलिखित गुण का उपयोग कर कॉन्फ़िगर करने की:

  • ConfigFile ...
  • ConfigFileExtension ...

तो ConfigFile या ConfigFileExtension संपत्तियों की न निर्दिष्ट हैं, अनुप्रयोग कॉन्फ़िगरेशन फ़ाइल (जैसे TestApp.exe.config) लॉग 4net कॉन्फ़िगरेशन फ़ाइल के रूप में उपयोग की जाएगी।

उदाहरण उपयोग:

// Configure log4net using the .config file 
[assembly: log4net.Config.XmlConfigurator(Watch=true)] 
// This will cause log4net to look for a configuration file 
// called TestApp.exe.config in the application base 
// directory (i.e. the directory containing TestApp.exe) 
// The config file will be watched for changes. 

मैं मानता हूँ कि यह थोड़ा अस्पष्ट है, लेकिन मैं उदाहरण के उपयोग के अस्तित्व की व्याख्या कि log4net मतलब करने के लिए ऊपर विशेषता के बिना .config फ़ाइल का उपयोग नहीं होगा; और तथ्य यह है कि वे इंगित करते हैं कि आपको दो गुणों में से एक का उपयोग करना है, लेकिन विशेषता को पूरी तरह से छोड़ने के बारे में कुछ भी मत कहो, मुझे सलाह है कि विशेषता (या प्रोग्रामेटिक कॉल) को app.config का उपयोग करने की आवश्यकता है जिस तरह से आप चाहते हैं।

+0

सभी ध्वनि काफी व्यावहारिक लगता है।फिर भी और अधिक खोज रहे हैं - मुझे विश्वास है कि मैंने एक स्पष्ट फ़ाइल को बिना किसी स्पष्ट XmlConfiguratorAttribute या XmlConfigurator.Configure कॉल के बिना लॉग फ़ाइल में उत्सर्जित किया है। यह उचित रूप से लगातार wrt 1.2.10 में काम नहीं कर रहा है, और प्रतिबिंबक के माध्यम से कोड यह सुझाव नहीं देता है कि यह मार्कर या स्पष्ट आमंत्रण के बिना काम करेगा। शायद मुझे इसके बजाय एनएलओजी का उपयोग करना चाहिए, और इनमें से कोई भी समस्या नहीं होगी: पी –

+1

@ रूबेन - आप लॉग 4नेट को प्रारंभ करने के लिए क्यों एक अलग ढांचे पर स्विच करेंगे? –

+1

@ पीटर लिलाववॉल्ड: मेरे पास ऐसा कोई इरादा नहीं है, यह सुनिश्चित नहीं है कि आपको यह विचार कहां मिला? मुझे यह समझने में दिलचस्पी है कि मैं कभी भी यह सोचने के लिए कैसे सोचता हूं कि इसे किसी भी प्रकार के स्पष्ट कॉन्फ़िगरेशन के बिना काम करने के लिए या कॉन्फ़िगरेटर को कॉल के माध्यम से काम करना संभव है। कॉन्फ़िगर करें ...? –