将log4net与Autofac一起使用

问题描述 投票:3回答:1

我正在尝试将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");

非常感谢

c# inversion-of-control autofac
1个回答
7
投票

要获得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"); 
© www.soinside.com 2019 - 2024. All rights reserved.