使用Log4Net模块旁边的Autofac注册Log4Net命名记录器

时间:2016-07-11 13:47:51

标签: c# logging log4net autofac

目前我正在使用Log4Net模块使用AutoFac注册我的记录器实例:

containerBuilder.RegisterModule(new Log4NetModule());

这很好,但是,现在我需要能够将某些日志记录行写入单独的文件。显然我希望这是可注射的,所以我想这样做:

接口:

public interface IStatisticsLogger : ILog
{ }

Autofac注册:

containerBuilder.RegisterInstance(LogManager.GetLogger("Statistics"))
   .As<IStatisticsLogger>();

Log4Net配置:

<logger name="Statistics" additivity="false">
  <level value="ALL" />
  <appender-ref ref="StatisticsFileAppender" />
</logger>

<appender name="StatisticsFileAppender" type="log4net.Appender.RollingFileAppender">
      <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="DEBUG" />
        <levelMax value="FATAL" />
      </filter>
      <file type="log4net.Util.PatternString" value="Logs\Statistics.txt"/>
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="1000KB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date,%message%newline" />
      </layout>
</appender>

类别:

public Service(ILog logging, IStatisticsLogger statisticsLogger)
{
   // logging = General logging
   // statisticsLogger = Log to a specific file
   ...
}

但是,当我运行时,我收到以下错误:

log4net.Core.LogImpl类型无法分配给服务IStatisticsLogger

关于如何实现目标的任何想法?

1 个答案:

答案 0 :(得分:2)

通过

containerBuilder.RegisterInstance(LogManager.GetLogger("Statistics"))
                .As<IStatisticsLogger>();

您正在告诉 Autofac LogManager.GetLogger("Statistics")的{​​{1}}转发给ILog。这是无效的,因为IStatisticsLogger不是ILog

为了使用IStatisticsLogger接口,您应该具有此类接口的实现。

IStatisticsLogger

然后,您将能够在 Autofac 中注册此类型:

public class StatisticsLogger : IStatisticsLogger 
{
    public StatisticsLogger(ILog logger)
    {
            this._logger =  logger; 
    }
    private readonly ILog _logger; 

    // implements ILog 
    public virtual void Info(Object message)
    {
        this._logger.info(message); 
    }

    // etc. 
}

实施containerBuilder.RegisterType<StatisticsLogger>() .WithParameter("logger", LogManager.GetLogger("Statistics")) .As<IStatisticsLogger>(); 非常无聊。您可以依赖 log4net 的默认实现。

ILog

并且注册将是这样的:

public class StatisticsLogger : LogImpl, IStatisticsLogger
{
    public StatisticsLogger(ILogger logger) : base(logger)
    { }
}