从代码中启用log4net的文件日志记录,而不是从配置中启用

17

为什么以下测试会失败呢?(使用xunit)我尝试了不同的appender,但它从未写入任何内容,虽然日志似乎已准备好写入。最终,我创建了自己的appender 来进行测试。

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

测试中你得到了什么信息?还是看起来什么都没有被调用? - Ty.
Append从未被调用 - 不知道为什么。即使在多个项目中使用log4net配置,它仍然是一个黑盒子。 - George Mauer
3个回答

42
我通常使用以下代码来配置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 步骤。 - George Mauer
我知道这是一篇旧帖子,但你需要在web.config中进行任何xml配置吗? - Evan Layman

2

我猜测可能是这样的...

你的程序集中是否定义了XmlConfiguration?

在测试项目中是否忘记添加它了?

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

有时候这会让我很烦恼。

这段话与IT技术无关。

好的,我通常使用log4net城堡温莎集成,所以我忘了 - 但是我根本没有使用XML文件! - George Mauer

0

仍然无法确定为什么上面的代码不起作用,但我通过替换所有配置代码成功地配置了log4net并使用了我的appender:

log4net.Config.BasicConfigurator.Configure(_appender);

请点击这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接