2009-09-17 15 views
17

¿Por qué en el mundo falla la siguiente prueba? (está en xunit) Lo he intentado con diferentes appenders y nunca escribe nada, aunque el registro parece que está listo para escribir. Finalmente creé mi propio appender solo para probarlo.Habilite el registro de archivos para log4net desde el código en lugar de desde la configuración

public class TestAppender : AppenderSkeleton { 
     public event Action<LoggingEvent> AppendCalled = delegate { }; 
     protected override void Append(LoggingEvent loggingEvent) { 
      AppendCalled(loggingEvent); 
     } 
    } 
    public class Class1 { 
     private TestAppender _appender = new TestAppender(); 
     public Class1() { 
      log4net.Util.LogLog.InternalDebugging = true; 
      Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository(); 
      Logger rootLogger = hierarchy.Root; 
      rootLogger.Level = Level.All; 
      Logger coreLogger = hierarchy.GetLogger("abc") as Logger; 
      coreLogger.Level = Level.All; 

      coreLogger.Parent = rootLogger; 
      PatternLayout patternLayout = new PatternLayout(); 
      patternLayout.ConversionPattern = "%logger - %message %newline"; 
      patternLayout.ActivateOptions(); 
      _appender.Layout = patternLayout; 
      _appender.ActivateOptions(); 
      coreLogger.AddAppender(_appender);    
     } 
     [Fact] 
     public void Test() { 
      bool called = false; 
      _appender.AppendCalled += e => called = true; 
      var log = LogManager.GetLogger("abc"); 
      log.Debug("This is a debugging message"); 
      Thread.Sleep(TimeSpan.FromSeconds(2)); 
      log.Info("This is an info message"); 
      Thread.Sleep(TimeSpan.FromSeconds(2)); 
      log.Warn("This is a warning message"); 
      Thread.Sleep(TimeSpan.FromSeconds(2)); 
      log.Error("This is an error message"); 
      Assert.True(called); 
     } 
} 
+0

¿Qué información obtienes en la prueba? ¿O simplemente parece que no se llama nada? –

+0

Anexar nunca se llama, ni idea de por qué. La configuración de log4net aún me parece un poco negra, incluso después de usarla en varios proyectos. –

Respuesta

40

Siempre utilizo el siguiente código para configurar log4net desde el código. ¡Funciona genial!

Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository(); 
hierarchy.Root.RemoveAllAppenders(); /*Remove any other appenders*/ 

FileAppender fileAppender = new FileAppender(); 
fileAppender.AppendToFile = true; 
fileAppender.LockingModel = new FileAppender.MinimalLock(); 
fileAppender.File = Server.MapPath("/") + "log.txt"; 
PatternLayout pl = new PatternLayout(); 
pl.ConversionPattern = "%d [%2%t] %-5p [%-10c] %m%n%n"; 
pl.ActivateOptions(); 
fileAppender.Layout = pl; 
fileAppender.ActivateOptions(); 

log4net.Config.BasicConfigurator.Configure(fileAppender); 

//Test logger 
ILog log =LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 
log.Debug("Testing!"); 
+1

wow gracias, nunca supe sobre el BasicConfigurator.Configure paso –

+0

Sé que esta es una publicación anterior, pero ¿necesita hacer alguna configuración xml en el web.config? –

2

sólo tirar una conjetura por ahí ...

¿Tiene usted la XmlConfiguration definido en su asamblea?

¿Lo olvidaste en tu proyecto de prueba?

[assembly: log4net.Config.XmlConfigurator(Watch = true)] 

Eso usualmente me quema de vez en cuando.

+0

Buena llamada Suelo usar log4net castle windsor integration así que lo olvidé - ¡pero no estoy usando ningún archivo xml! –

0

Todavía no se puede decir por qué el código anterior no funciona pero me dio Log4net para configurar correctamente y usar mi appender mediante la sustitución de todo el código de configuración con:

log4net.Config.BasicConfigurator.Configure(_appender); 

De here.

Cuestiones relacionadas