启用文件日志从code,而不是从配置log4net的 [英] Enable file logging for log4net from code instead of from configuration

查看:206
本文介绍了启用文件日志从code,而不是从配置log4net的的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为什么在世界上没有下面的测试失败? (其的xUnit)我试着用不同的追加程序,它永远不会写任何东西,虽然日志好像它是准备写。我终于创建了自己的appender只是为了测试它。

 公共类TestAppender:AppenderSkeleton {
        公共事件动作< LoggingEvent所> AppendCalled =委托{};
        保护覆盖无效追加(LoggingEvent所LoggingEvent所){
            AppendCalled(LoggingEvent所);
        }
    }
    公共类的Class1 {
        私人TestAppender _appender =新TestAppender();
        公共Class1的(){
            log4net.Util.LogLog.InternalDebugging = TRUE;
            层次层次=(层次)LogManager.GetRepository();
            记录仪rootLogger = hierarchy.Root;
            rootLogger.Level = Level.ALL的;
            记录仪coreLogger = hierarchy.GetLogger(ABC)作为记录仪;
            coreLogger.Level = Level.ALL的;

            coreLogger.Parent = rootLogger;
            的PatternLayout的PatternLayout =新的PatternLayout();
            patternLayout.ConversionPattern =%记录仪 - %消息%换行;
            patternLayout.ActivateOptions();
            _appender.Layout =的PatternLayout;
            _appender.ActivateOptions();
            coreLogger.AddAppender(_appender);
        }
        [事实]
        公共无效测试(){
            布尔叫= FALSE;
            _appender.AppendCalled + = E =>所谓= TRUE;
            VAR数= LogManager.GetLogger(ABC);
            log.Debug(这是一个调试信息);
            Thread.sleep代码(TimeSpan.FromSeconds(2));
            log.Info(这是一个信息消息);
            Thread.sleep代码(TimeSpan.FromSeconds(2));
            log.Warn(这是一个警告信息);
            Thread.sleep代码(TimeSpan.FromSeconds(2));
            log.Error(这是一个错误信息);
            Assert.True(所谓的);
        }
}
 

解决方案

我总是用下面的code配置从code log4net的。伟大的作品!

 层次等级=(层次)LogManager.GetRepository();
hierarchy.Root.RemoveAllAppenders(); / *删除任何其他附加目的地* /

FileAppender fileAppender =新的FileAppender();
fileAppender.AppendToFile =真;
fileAppender.LockingModel =新FileAppender.MinimalLock();
fileAppender.File =使用Server.Mappath(/)+的log.txt;
的PatternLayout PL =新的PatternLayout();
pl.ConversionPattern =%D [%2%T]%-5p [%-10℃]%M%N%N的;
pl.ActivateOptions();
fileAppender.Layout = PL;
fileAppender.ActivateOptions();

log4net.Config.BasicConfigurator.Configure(fileAppender);

//测试记录仪
ILog的日志= LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod()DeclaringType。);
log.Debug(测试!);
 

Why in the world does the following test fail? (its in xunit) I've tried it with different appenders and it never writes anything though the log seems like it is ready to write. I eventually created my own appender just to test it.

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

解决方案

I always use the code below to configure log4net from code. Works great!

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!");

这篇关于启用文件日志从code,而不是从配置log4net的的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆