[asp.net]在 Autofac 手动注册 Log4Net 记录器实例与 ILog 的缺点是什么?

发布时间: 2017/3/26 4:36:48
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

Autofac 具有log4net 集成模块称为LoggingModule

然而,我手动注册ILog 记录器,而无需使用LoggingModule,和它似乎工作正常。

ILog log = LogManager.GetLogger("Logger");
builder.RegisterInstance(log).As<ILog>().SingleInstance();

我的问题是— — 什么是使用上述方法而不是使用LoggingModule的检测不利副作用。

web.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <log4net>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="mylogfile.txt" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="5" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
      </layout>
    </appender>
    <root>
      <level value="DEBUG" />
      <appender-ref ref="RollingFileAppender" />
    </root>
  </log4net>
</configuration>

动作

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

namespace DemoLog4NetAuftofac
{
    public class MvcApplication : HttpApplication
    {
        protected void Application_Start()
        {
            var builder = new ContainerBuilder();

            builder.RegisterControllers(typeof(MvcApplication).Assembly);

            ILog log = LogManager.GetLogger("Logger");
            builder.RegisterInstance(log).As<ILog>().SingleInstance();

            var container = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);
        }
    }
}

HomeController

namespace DemoLog4NetAuftofac.Controllers
{
    public class HomeController : Controller
    {
        public HomeController(ILog log)
        {
            log.Debug("Debug application");
            log.Error("Error application");
            log.Info("Info application");
        }
    }
}

版本

  <package id="Autofac" version="3.4.0" targetFramework="net45" />
  <package id="Autofac.Mvc5" version="3.3.4" targetFramework="net45" />
  <package id="log4net" version="2.0.3" targetFramework="net45" />

解决方法 1:

LoggingModule提供的Autofac为先进的样本,一个自定义的模块。

本模块和自定义注册的唯一区别是,模块将使用不同 ILog 每个地方,注入而在代码中,您将只使用一个实例的类型的实例 ILog

例如︰

public class Foo
{
    public Foo(ILog log)
    { 
        Console.WriteLine(log.Logger.Name);
    }
}
public class Bar
{
    public Bar(ILog log)
    { 
        Console.WriteLine(log.Logger.Name);
    }
}

与您的自定义注册 log 注入到 FooBar 将相同,他们将结果 LogManager.GetLogger("Logger") 。如果您使用 LoggingModule log 会导致 LogManager.GetLogger(typeof(Foo))FooLogManager.GetLogger(typeof(Bar))Bar

具有不同实例的 ILog 将帮助您筛选日志中的特定类型和事情那样。

您的注册已没问题但使用 LoggingModule 将允许您筛选或指定某些类或命名空间的日志级别。

顺便说一句,我推荐你读 LoggingModule 源代码,它不是真的很难,它将帮助你更好地理解如何模块参数Autofac一起工作。

官方微信
官方QQ群
31647020