【问题标题】:Enable file logging for log4net from code instead of from configuration从代码而不是配置为 log4net 启用文件日志记录
【发布时间】:2009-09-17 04:32:57
【问题描述】:

为什么下面的测试会失败? (它在 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);
        }
}

【问题讨论】:

  • 你在测试中得到了什么信息?还是只是看起来什么都没有被调用?
  • Append 永远不会被调用 - 不知道为什么。 log4net 配置对我来说仍然是一个黑盒子,即使在多个项目中使用它。

标签: c# .net log4net


【解决方案1】:

我总是使用下面的代码从代码中配置 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!");

【讨论】:

  • 哇,谢谢,我从来不知道 BasicConfigurator.Configure 步骤
  • 我知道这是一个旧帖子,但您需要在 web.config 中进行任何 xml 配置吗?
【解决方案2】:

只是猜测......

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

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

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

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

【讨论】:

  • 好电话我通常使用 log4net 城堡温莎集成所以我忘了 - 但我根本没有使用 xml 文件!
【解决方案3】:

仍然无法说明为什么上面的代码不起作用,但我可以正确配置 log4net 并通过将所有配置代码替换为以下代码来使用我的 appender:

log4net.Config.BasicConfigurator.Configure(_appender);

来自here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 2010-12-27
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    相关资源
    最近更新 更多