带有DI Simple Injector的log4net

我正在尝试使用Simple Injector(+ integration MVC)v 2.5.2。 对于MVC 4应用程序,我也需要跟踪/记录性能(执行)(通过log4net模块)。 当前实现(在运行时)在指定的路径中创建log4net文件,但没有写入任何文本行(当我调试它时,一切都没有错误到_logger.Info(“message”)的结尾)。

有没有人尝试使用Simple Injector DI for log4net?

我注册log4net模块的方式是:

public static class LoggingModule { public static void RegisterServices(Container container) { string log4NetConfigFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log4net.config"); log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(log4NetConfigFile)); var logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); container.RegisterSingle(logger); } } 

并在Global.asax

 LoggingModule.RegisterServices(container); 

Log4net配置文件看起来像这样(我不认为有任何问题):

                      

并打开/关闭我一直在使用的日志记录:

 private static void RegisterIPerformanceStatisticLogger(Container container) { if (ShouldLogPerformance()) { container.Register(WebLifestyle); } else { // do nothing container.Register(WebLifestyle); } } 

并且PerformanceStatisticLogger或DisablePerformanceStatisticLogger设置

 IsLoggingEnabled = true; // | false IsAPITraceEnabled = false; // | true 

我做错了什么? 在我看来注射方式的问题。 谢谢你的建议

在配置log4net时,Simple Injector没有什么特别之处。 例如,您可以按如下方式注册ILog

 container.RegisterSingleton(LogManager.GetLogger(typeof(object))); 

显然,这为整个应用程序注册了一个记录器。 如果您想为每个类注入不同的记录器,则必须定义自己的适配器实现:

 public sealed class Log4NetAdapter : LogImpl { public Log4NetAdapter() : base(LogManager.GetLogger(typeof(T)).Logger) { } } 

您可以按如下方式注册此适配器:

 container.RegisterConditional(typeof(ILog), c => typeof(Log4NetAdapter<>).MakeGenericType(c.Consumer.ImplementationType), Lifestyle.Singleton, c => true); 

这可确保每个使用者获得自己的Log4NetAdapter实现。

请注意,尽管IMO最好阻止应用程序代码依赖第三方库抽象。 我认为定义自己的记录器抽象要好得多。

我对log4net的体验是,当log4net没有记录任何内容时,你的log4net配置有问题。 我讨厌log4net的原因是,当你配置错误时它永远不会抛出任何exception。 它只是吞下并继续,这使得使用log4net比它应该更痛苦。

有一点可以帮助就是在启动时LogLog.LogReceived log4net的LogLog.LogReceived事件。 这允许您检查是否有任何错误。 例如,这是我在之前项目中使用的代码:

 LogLog.LogReceived += (s, e) => { if (e.LogLog.Prefix.Contains("ERROR")) { throw new ConfigurationErrorsException(e.LogLog.Message, e.LogLog.Exception); } }; 

当log4net配置错误时,这可确保您的应用程序直接停止,但有明确的exception。