2012-06-14 21 views
8

Uygulamamdan bazı uygulama mesajlarını günlüğe kaydetmeyi denemek istiyorum. Bu durumda sadece rahibin log4net ile çalışmaya zorlanmasını istiyorum. Burada bir örnek buldum http://www.ofconsulting.com/PublicPortal/ofc-tech-blog/92-configure-log4net-with-nunit.html.log4net ve nunit testleri, en temel örnek

log4net böyle app.config confugured edilir:

<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> 

Ve benim test kodu

takip ediyor

[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"); 
    } 

Testim geçirilir ama hiçbir şey log.txt dosyasının içinde yazılır . Neyi yanlış yapıyorum?
Sadece bir uygulama girmek, uygulamadan çıkmak gibi mesajları saklamak için mümkün olduğunca basit bir hale getirmek istiyorum. Saygılarımızla.

[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() 
    { 
     // ... 
    } 

Ben de Log4Net.config dosyasını yerine app.config dosyasını kullanmak istiyorum, sadece daha temiz görünüyor: Eğer böyle bir şey yapmak için

+0

Log4Net normal çalışıyor mu? Sormamın sebebi, Log4Net ... – Faraday

+0

'u yüklemenize gerek olup olmadığımızı bilmek istiyorum. Ayrıca, sınıflarımın her birini sınıflarım arasında kopyalamak/yapıştırmak için kullandığım her sınıfta yazmamızı sağlamak için: özel statik readonly ILog Logger = LogManager.GetLogger (MethodBase.GetCurrentMethod(). DeclaringType); – Faraday

+0

normalde çalıştığı anlamına mı geliyor? :) Test projeme log4net referansını ekledim ve kodun geri kalanı burada yayınlandı, test testinde veya prj'de verilen hata mesajı yok. – panjo

cevap

5

En iyi tahminle olurdu.

<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

sorun (görsel stüdyoda ReSharper çalıştırmak) NUnit testi koşucu başka klasörden test çalıştırır olmasıdır (halinin kopyası testi takımını gölge), yani xml: İşte bir örnek log4net.config dosyasıdır Yapılandırma, tam yapılandırma yolunu belirtmediğiniz sürece bu noktada kullanılamaz. Ondan sonra deney çıkışında günlük çıkışını görmelisiniz

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

:

Sen elbette temel yapılandırmasını kullanmak ve benzeri kodunda günlük yapılandırmasını belirtebilirsiniz.

3

Dosyanın kendisini kontrol etmek için birim testinizi ayarlayabilirsiniz (manuel inceleme yerine). Ortam değişkenlerinde saklanan dosya yoluna dikkat edin. Bu, TeamCity test koşucuları üzerinde de çalışır (bir yolu kodlamaya gerek yoktur).

Yapılandırma:

<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> 

Kodu: biliyorum ve ben herhangi yapılandırma dosyasını hiç kullanılmamış nunit ile Log4net, kullanıldığı gibi

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

Uzun, sadece satır aşağıdaki eklemem gerekiyor sınama sınıfı kurucusu

BasicConfigurator.Configure(); 

here is the full answer Örnek test sınıfını görmek isterseniz

+0

Kısa ve Mükemmel! – ShloEmi