2012-06-14 23 views
8

मैं अपने ऐप से कुछ ऐप संदेशों को लॉग इन करना चाहता हूं। इस स्थिति में मैं सिर्फ nunit को log4net के साथ काम करने के लिए मजबूर करना चाहता हूं। मुझे यहां कुछ उदाहरण मिला http://www.ofconsulting.com/PublicPortal/ofc-tech-blog/92-configure-log4net-with-nunit.htmllog4net और nunit परीक्षण, सबसे बुनियादी उदाहरण

log4net इस तरह app.config में confugured है:

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

<log4net> 
    <root> 
     <level value="DEBUG" /> 
     <appender-ref ref="LogFileAppender" /> 
    </root> 
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" > 
     <param name="File" value="log.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="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n" /> 
     </layout> 
    </appender> 
    </log4net> 

और मेरे परीक्षण कोड में पीछा कर रहा है

[TestFixture] 
class DomainTests 
{ 
    protected static readonly ILog log = LogManager.GetLogger(typeof(DomainTests)); 
    public void LoggingTests() 
    {    
     log4net.Config.XmlConfigurator.Configure(); 
    } 

    [Test] 
    public void BasicLogTest() 
    { 
     log.Error("write my log entry already"); 
    } 

मेरे परीक्षा उत्तीर्ण की है, लेकिन कुछ भी नहीं log.txt फ़ाइल के भीतर लिखे गए । मैं क्या गलत कर रहा हूं?
मैं बस इसे आवेदन करने जैसे संदेशों को संग्रहीत करने के लिए जितना संभव हो सके उतना आसान बनाना चाहता हूं, आवेदन से बाहर निकलें। सादर।

[TestFixture] 
class DomainTests 
{ 
    protected static readonly ILog log = LogManager.GetLogger(typeof(DomainTests)); 
    public void LoggingTests() 
    {    
     log4net.Config.XmlConfigurator.Configure(); 
    } 

    [Test] 
    public void BasicLogTest() 
    { 
     log.Error("write my log entry already"); 
    } 

    [SetUp] 
    RunBeforeAnyTests() 
    { 
     BasicConfigurator.Configure(); 
    } 

    [TearDown] 
    RunAfterAnyTests() 
    { 
     // ... 
    } 

मैं भी app.config फ़ाइल Log4Net.config फ़ाइल के बजाय का उपयोग करेंगे, यह सिर्फ क्लीनर लगता है:

+0

देखना चाहते हैं तो क्या लॉग 4नेट सामान्य रूप से काम करता है? कारण मैं पूछता हूं कि मैं जानना चाहता हूं कि हमें लॉग 4Net की लोडिंग के माध्यम से जाना है ... – Faraday

+0

इसके अलावा, जब भी मैं कक्षाओं के बीच अपना लॉग कॉपी/पेस्ट करने के लिए इसका उपयोग करता हूं, तो आप अपना क्लास नाम टाइप करते हैं: निजी स्थैतिक रीडोनली ILog लॉगर = LogManager.GetLogger (MethodBase.GetCurrentMethod()। DeclaringType); – Faraday

+0

इसका मतलब यह कैसे है कि यह सामान्य रूप से काम करता है? :) मुझे अपने परीक्षण प्रोजेक्ट में लॉग 4नेट संदर्भ जोड़ा गया है और शेष कोड यहां पोस्ट किया गया है, परीक्षण चलाने या prj निर्माण में कोई त्रुटि संदेश नहीं दिया गया है। – panjo

उत्तर

5

मेरे सर्वोत्तम अनुमान आप इस तरह कुछ करने के लिए के लिए किया जाएगा।

<log4net> 
    <!-- A1 is set to be a LogFileAppender --> 
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender, log4net" > 
    <param name="File" value="C:\logging\log.txt" /> 
    <file value="c:\logging\Main" /> 
    <appendToFile value="true" /> 
    <datePattern value="yyyyMMdd'.log'" /> 
    <rollingStyle value="Composite" /> 
    <staticLogFileName value="false" /> 
    <maxSizeRollBackups value="-1" /> 
    <maximumFileSize value="500MB" /> 

    <!-- A1 uses PatternLayout --> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> 
    </layout> 
    </appender> 
    <!-- Set root logger level to DEBUG and its only appender to LogFileAppender --> 
    <root> 
    <!--<level value="OFF" />--> 
    <!--<level value="FATAL" />--> 
    <!--<level value="ERROR" />--> 
    <!--<level value="WARN" />--> 
    <!--<level value="INFO" />--> 
    <level value="DEBUG" /> 
    <!--<level value="ALL" />--> 
    <appender-ref ref="LogFileAppender" /> 
    </root> 
</log4net> 
18

समस्या यह है कि NUnit परीक्षण धावक (जब दृश्य स्टूडियो में ReSharper से चलाने) अन्य फ़ोल्डर से परीक्षण चलाता है (यह प्रतियां शैडो परीक्षण विधानसभा), इसलिए xml: यहाँ एक उदाहरण log4net.config फ़ाइल है कॉन्फ़िगरेशन उस बिंदु पर तब तक उपलब्ध नहीं है जब तक कि आप पूर्ण कॉन्फ़िगर पथ निर्दिष्ट न करें।

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

log4net.Config.BasicConfigurator.Configure(
    new log4net.Appender.ConsoleAppender { 
    Layout = new log4net.Layout.SimpleLayout()}); 

आपको लगता है कि परीक्षण के बाद उत्पादन में लॉग उत्पादन देखना चाहिए।

3

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

कॉन्फ़िग:

<log4net> 
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file type="log4net.Util.PatternString" value="%env{ALLUSERSPROFILE}\test.log" /> 
    <appendToFile value="true" /> 
    <maxSizeRollBackups value="10" /> 
    <maximumFileSize value="10MB" /> 
    <rollingStyle value="Size" /> 
    <staticLogFileName value="true" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> 
    </layout> 
    </appender> 
    <root> 
    <level value="INFO" /> 
    <appender-ref ref="RollingLogFileAppender" /> 
    </root> 
</log4net> 

कोड:

private string _expectedFile; 

[SetUp] 
public void SetUp() 
{ 
    _expectedFile = Path.Combine(
     Environment.GetEnvironmentVariable("ALLUSERSPROFILE"), 
     "test.log"); 

    if (File.Exists(_expectedFile)) 
     File.Delete(_expectedFile); 

    XmlConfigurator.Configure(); 
} 

[Test] public void GivenLog4NetFileAppender_WhenLogInfoStringWithLog4Net_ThenWritesToDisk() 
{ 
    ILog log = LogManager.GetLogger(typeof (LoggingIntegrationTests)); 
    log.Info("Message from test"); 

    LogManager.Shutdown(); 

    Assert.That(File.ReadAllText(_expectedFile), 
       Is.StringContaining("Message from test")); 
} 
3

मैं लंबे समय के रूप में मुझे पता है और प्रयोग किया जाता nunit साथ log4net, मैं किसी भी कॉन्फ़िग फ़ाइल इस्तेमाल कभी नहीं किया, तो आप सिर्फ में लाइन निम्नलिखित जोड़ने की जरूरत टेस्ट क्लास कन्स्ट्रक्टर

BasicConfigurator.Configure(); 

here is the full answer यदि आप नमूना परीक्षण कक्षा

+0

लघु और बिल्कुल सही! – ShloEmi