2009-09-17 22 views
17

Dlaczego na świecie kończy się poniższy test? (w xunit) Próbowałem go z różnymi aplikatorami i nigdy nie pisze nic, chociaż log wydaje się być gotowy do napisania. W końcu stworzyłam własnego aplikanta, żeby go przetestować.Włącz rejestrowanie plików dla log4net z kodu zamiast z konfiguracji

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

Jakie informacje otrzymasz w teście? Czy po prostu wygląda na to, że nic nie nazywa? –

+0

Dołącz nigdy nie jest wywoływany - nie ma pojęcia dlaczego. Konfiguracja log4net nadal jest dla mnie czarną skrzynką nawet po użyciu jej w kilku projektach. –

Odpowiedz

40

Zawsze używam poniższego kodu, aby skonfigurować log4net z kodu. Działa świetnie!

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

dziękuję, nigdy nie wiedziałem o kroku BasicConfigurator.Configure –

+0

Wiem, że to stary post, ale czy musisz zrobić jakąkolwiek konfigurację xml w web.config? –

2

tylko rzucanie przypuszczenie tam ...

Czy masz XmlConfiguration zdefiniowane w zespole?

Czy zapomniałeś o tym w swoim projekcie testowym?

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

To zwykle mnie pali raz na jakiś czas.

+0

Dobre połączenie Zwykle używam integracji wind4net castle windsor, więc zapomniałem - ale w ogóle nie używam pliku xml! –

0

Nadal nie mogę powiedzieć dlaczego powyższy kod nie działa, ale mam log4net poprawnie skonfigurować i używać appender zastępując cały kod konfiguracji z:

log4net.Config.BasicConfigurator.Configure(_appender); 

Od here.

Powiązane problemy