2016-07-11 5 views
1

В настоящее время я использую модуль Log4Net зарегистрировать свои экземпляры регистратора с помощью AutoFac:Регистрация Log4Net Названный Logger с Autofac рядом с Log4Net модулем

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.

Любые идеи о том, как я могу достичь своей цели?

+0

Предполагая, что AutoFac поддерживает интерфейсы экземпляров, вы можете отдать свой экземпляр, то есть '.RegisterInstance ((ILOG) LogManager.GetLogger ("Статистика")) ' – stuartd

+0

GetLogger() уже возвращает ILog, поэтому кастинг ничего не делает – Stitch10925

+0

Причина, по которой я предположил, что я заметил, что сообщение об ошибке ссылается на« log4net.Core.LogImpl », который является реализацией ILog по умолчанию, возвращаемой GetLogger. – stuartd

ответ

1

Поступая

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

вы говорите Autofac бросить возвращение LogManager.GetLogger("Statistics"), который является ILog к IStatisticsLogger. Это неверно, так как ILog не является IStatisticsLogger.

Для использования интерфейса IStatisticsLogger вы должны иметь реализацию такого интерфейса.

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. 
} 

Тогда вы сможете зарегистрировать этот тип в Autofac:

containerBuilder.RegisterType<StatisticsLogger>() 
       .WithParameter("logger", LogManager.GetLogger("Statistics")) 
       .As<IStatisticsLogger>(); 

Реализация ILog довольно скучный. Вы можете положиться на стандартную реализацию log4net.

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

и регистрация будет выглядеть следующим образом:

containerBuilder.RegisterType<StatisticsLogger>() 
       .WithParameter("logger", LogManager.GetLogger("Statistics").Logger) 
       .As<IStatisticsLogger>(); 
+0

Работает как очарование! Спасибо за подробное объяснение. – Stitch10925

Смежные вопросы