gpt4 book ai didi

c# - 带有 DI 简单注入(inject)器的 log4net

转载 作者:太空狗 更新时间:2023-10-29 19:59:39 24 4
gpt4 key购买 nike

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

有人尝试为 log4net 使用 Simple Injector DI 吗?

我注册 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 配置文件看起来是这样的(我认为没有任何问题):

<log4net>
<appender name="PerformanceLogFile" type="log4net.Appender.RollingFileAppender" >
<param name="File" value="..\Performance\PricingManager" />
<param name="AppendToFile" value="true" />
<param name="RollingStyle" value="Date" />
<param name="DatePattern" value="_yyyy-MM-dd.lo\g" />
<param name="MaxSizeRollBackups" value="10" />
<param name="StaticLogFileName" value="false" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%m%n"/>
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="INFO" />
<param name="LevelMax" value="FATAL" />
</filter>
</appender>
<logger name="SoftTech.PricingEngine.PricingService.PerformanceStatisticLoggerWithAPI">
<level value="ALL" />
<appender-ref ref="PerformanceLogFile" />
</logger>
</log4net>

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

private static void RegisterIPerformanceStatisticLogger(Container container)
{
if (ShouldLogPerformance())
{
container.Register<IPerformanceStatisticLogger, PerformanceStatisticLogger>(WebLifestyle);
}
else
{
// do nothing
container.Register<IPerformanceStatisticLogger, DisabledPerformanceStatisticLogger>(WebLifestyle);
}
}

并设置 PerformanceStatisticLogger 或 DisablePerformanceStatisticLogger

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

我做错了什么?在我看来是注入(inject)方式的问题。感谢您的任何建议

最佳答案

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

container.RegisterSingleton<ILog>(LogManager.GetLogger(typeof(object)));

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

public sealed class Log4NetAdapter<T> : 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<T>实现。

请注意,IMO 最好防止应用程序代码依赖第三方库抽象。我认为 define you own logger abstraction 好多了.

我对 log4net 的经验是,当 log4net 不记录任何内容时,您的 log4net 配置有问题。我讨厌 log4net 的地方在于,当您错误配置它时,它从不抛出任何异常。它只是吞下并继续,这使得使用 log4net 比它应该的更痛苦。

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

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

这可确保您的应用程序在 log4net 配置错误时直接停止并出现明显的异常。

关于c# - 带有 DI 简单注入(inject)器的 log4net,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25112251/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com