2009-09-17 4 views
17

Pourquoi dans le monde le test suivant échoue-t-il? (C'est en xunit) Je l'ai essayé avec différents appenders et il n'écrit jamais rien même si le journal semble être prêt à écrire. J'ai finalement créé mon propre appender juste pour le tester.Activer la consignation des fichiers pour log4net à partir du code au lieu de la configuration

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

Quelles informations obtenez-vous dans le test? Ou semble-t-il que rien n'est appelé? –

+0

Append n'est jamais appelé - aucune idée pourquoi. La configuration de log4net est encore un peu une boîte noire même après l'avoir utilisée sur plusieurs projets. –

Répondre

40

J'utilise toujours le code ci-dessous pour configurer log4net à partir du code. Fonctionne très bien!

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 merci, je n'ai jamais entendu parler de BasicConfigurator.Configure step –

+0

Je sais qu'il s'agit d'un ancien post mais avez-vous besoin de faire une configuration xml dans le web.config? –

2

jeter Juste une supposition là-bas ...

Avez-vous le XmlConfiguration défini dans votre assemblée?

L'avez-vous oublié dans votre projet de test?

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

Cela me brûle habituellement de temps en temps.

+0

Bon appel j'utilise habituellement l'intégration de log4net castle windsor donc j'ai oublié - mais je n'utilise pas un fichier xml du tout! –

0

ne peut toujours pas dire pourquoi le code ci-dessus ne fonctionne pas, mais je me suis Log4net pour configurer et utiliser correctement mon appender en remplaçant tout le code de configuration avec:

log4net.Config.BasicConfigurator.Configure(_appender); 

De here.

Questions connexes