2009-09-17 67 views
17

为什么世界上下列测试失败? (它在xunit中)我已经用不同的appender试过了,尽管日志似乎已经准备好写入,但它从不写任何东西。我最终创建了自己的appender来测试它。从代码而不是从配置启用log4net的文件日志记录

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

你在测试中得到什么信息?还是它看起来没有什么叫? – 2009-09-17 13:31:20

+0

追加从未被调用 - 不知道为什么。即使在多个项目中使用它,log4net配置对我来说仍然是一个黑盒子。 – 2009-09-17 16:46:05

回答

40

我总是使用下面的代码从代码配置log4net。很棒!

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

哇谢谢,我从来不知道有关BasicConfigurator.Configure步骤 – 2010-11-13 17:11:18

+0

我知道这是一个旧的帖子,但你需要在web.config中做任何XML配置? – 2011-07-29 18:46:54

2

只是抛出一个猜测有...

你已经在你的程序集中定义的XMLConfiguration中?

你在测试项目中忘了它吗?

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

这通常会让我每隔一段时间就会烧伤一次。

+0

好电话我通常使用log4net城堡windsor集成,所以我忘了 - 但我没有使用任何XML文件! – 2009-09-17 13:41:26

0

还不能说,为什么上面的代码不工作,但我得到了log4net的正确配置,并通过更换所有的配置代码中使用我的appender:

log4net.Config.BasicConfigurator.Configure(_appender); 

here