目前我正在使用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
。
关于如何实现目标的任何想法?
答案 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)
{ }
}