【问题标题】:Using log4net with Autofac将 log4net 与 Autofac 一起使用
【发布时间】:2018-11-13 17:25:55
【问题描述】:

我正在尝试将 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】:

    要获得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");
         }
    }
    

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

    // ...
    log4net.Config.XmlConfigurator.Configure();
    // ...
    iocBuilder.RegisterModule(new LoggingModule());
    iocBuilder.RegisterType<MyComponent>().AsSelf(); 
    
    // ...
    
    MyComponent c = iocContainer.Resolve<MyComponent>();
    c.Do(); 
    

    另一种解决方案是为Object 注册ILog 并解析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"); 
    

    【讨论】:

    • 谢谢。感谢您的评论,我更进一步。虽然它说。请求的服务“log4net.ILog”尚未注册。为避免此异常,请注册组件以提供服务,使用 IsRegistered() 检查服务注册,或使用 ResolveOptional() 方法解决可选依赖项。
    • 好的,现在问题可以继续使用stackoverflow.com/questions/19778170/…
    • 添加 log4net.Config.XmlConfigurator.Configure();在 MyComponent() 构造函数中
    • 您不需要在MyComponent 构造函数中添加log4net.Config.XmlConfigurator.Configure();。每个应用程序只需调用一次
    • 此代码示例与OP提到的autofac log4net模块不对应,只需具有公共ILog属性就足够了。不需要构造函数注入。
    猜你喜欢
    • 2017-06-04
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    相关资源
    最近更新 更多