加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 将log4net与Autofac一起使用

发布时间:2020-12-15 23:23:22 所属栏目:百科 来源:网络整理
导读:我正在尝试将log4net与Autofac一起使用. 我已粘贴此代码 http://autofac.readthedocs.org/en/latest/examples/log4net.html, 从Program.cs / Main()我正在做 var iocBuilder = new ContainerBuilder();iocBuilder.RegisterModule(new LoggingModule());var i
我正在尝试将log4net与Autofac一起使用.
我已粘贴此代码 http://autofac.readthedocs.org/en/latest/examples/log4net.html,
从Program.cs / Main()我正在做

var iocBuilder = new ContainerBuilder();
iocBuilder.RegisterModule(new LoggingModule());
var iocContainer = iocBuilder.Build();

现在我想立即尝试(在下一行),
在日志文件中写一个简单的行.我该怎么办?

我在想这样的事情

var ls = iocContainer.Resolve<LoggingModule>();
ls.Info("the logging is working");

非常感谢

解决方法

要获得ILog,log4net需要知道使用记录器的类(LogManager.GetLogger(…)).因此,如果没有父类,则无法解析ILog.您必须在组件中注入ILog.

public class MyComponent
{
     public MyComponent(ILog logger)
     {
          this._logger = logger; 
     }

     private readonly ILog _logger; 

     public void Do()
     { 
          this._logger.Info("Log4net OK");
     }
}

在应用程序启动时(Asp.net的Global.asax.cs,MVC):

// ...
log4net.Config.XmlConfigurator.Configure();
// ...
iocBuilder.RegisterModule(new LoggingModule());
iocBuilder.RegisterType<MyComponent>().AsSelf(); 

// ...

MyComponent c = iocContainer.Resolve<MyComponent>();
c.Do();

另一种解决方案是注册ILog for Object并解决ILog.在这种情况下,不需要该模块.

//在DI容器构建器中:

log4net.Config.XmlConfigurator.Configure();
/// ...
ContainerBuilder cb = new ContainerBuilder()
cb.Register(c => LogManager.GetLogger(typeof(Object))).As<ILog>();
IContainer container = cb.Build();

//在我们需要记录器的函数中:

ILog logger = container.Resolve<ILog>();
logger.Info("log4net OK");

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读