2012-06-14 21 views
8

Quiero intentar registrar algunos mensajes de la aplicación desde mi aplicación. En esta misma situación, solo quiero forzar a nunit a trabajar con log4net. Encontré algún ejemplo aquí http://www.ofconsulting.com/PublicPortal/ofc-tech-blog/92-configure-log4net-with-nunit.html.pruebas log4net y nunit, el ejemplo más básico

log4net se confugured en app.config así:

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

Y en mi código de prueba está siguiendo

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

Mi prueba se pasa pero nada está escrito en el interior archivo log.txt . ¿Qué estoy haciendo mal?
Solo quiero que sea lo más simple posible almacenar mensajes como ingresar una aplicación, salir de la aplicación. Saludos.

+0

¿Log4Net funciona normalmente? La razón por la que pregunto es que quiero saber si necesitamos completar la carga de Log4Net ... – Faraday

+0

Además, para evitar que escriba su nombre de clase cada vez que uso esto para copiar/pegar mi registro entre clases: private static readonly ILog Logger = LogManager.GetLogger (MethodBase.GetCurrentMethod(). DeclaringType); – Faraday

+0

¿cómo quiere decir que funciona normalmente? :) Se agrega la referencia de log4net a mi proyecto de prueba y el resto del código se publica aquí, no se muestra ningún mensaje de error al ejecutar la prueba o compilar prj. – panjo

Respuesta

5

Mi mejor conjetura sería para que usted pueda hacer algo como esto:

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

También me utilizo el archivo log4net.config en lugar del archivo app.config, apenas se parece más limpio. Aquí está un ejemplo de archivo log4net.config:

<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

El problema es que el corredor de prueba NUnit (cuando se ejecuta desde ReSharper en el estudio visual) ejecuta la prueba de otra carpeta (que las instantáneas del conjunto de prueba), por lo que el xml la configuración no está disponible en ese punto a menos que especifique la ruta de configuración completa.

Se puede usar, por supuesto, la configuración básica y especificar la configuración de registro en el código, como:

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

Debería ver la salida del registro en la salida de prueba después de eso.

3

Puede ajustar la prueba de su unidad para verificar el archivo en sí (en lugar de la inspección manual). Observe la ruta del archivo almacenada en las variables de entorno. Esto también funciona en los corredores de prueba de TeamCity (no es necesario codificar una ruta).

Config:

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

Código:

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

que siempre que sé y lo utilizó log4net con nunit, que nunca habían usado algún archivo de configuración, sólo tiene que añadir siguiente línea en constructor de la clase de prueba

BasicConfigurator.Configure(); 

here is the full answer si desea ver la clase de prueba de muestra

+0

corto y perfecto! – ShloEmi