gpt4 book ai didi

design-patterns - 如何使用 log4net 进行依赖注入(inject)

转载 作者:行者123 更新时间:2023-12-03 05:17:22 26 4
gpt4 key购买 nike

我试图找出 log4net 与依赖注入(inject)框架的正确模式和用法。

Log4Net使用ILog接口(interface),但需要我调用

LogManager.GetLogger(Reflection.MethodBase.GetCurrentMethod().DeclaringType)

在我需要记录信息的每个类或方法中。这似乎违背了 IoC 原则,让我不得不使用 Log4Net。

我应该以某种方式在某处放入另一层抽象吗?

此外,我需要记录自定义属性,例如当前用户名,如下所示:

log4net.ThreadContext.Properties["userName"] = ApplicationCache.CurrentUserName;

我怎样才能封装它,这样我就不必每次都记得这样做,并且仍然维护当前正在记录的方法。我应该做这样的事情还是我完全没有达到目的?

public static class Logger
{
public static void LogException(Type declaringType, string message, Exception ex)
{
log4net.ThreadContext.Properties["userName"] = ApplicationCache.CurrentUserName;
ILog log = LogManager.GetLogger(declaringType);
log.Error(message, ex);
}
}

最佳答案

我觉得你只见树木不见森林。 ILog 和 LogManager 是一个轻量级外观,几乎 1:1 相当于 Apache commons-logging,并且实际上并不将您的代码与 log4net 的其余部分耦合。

<rant>
我还发现,几乎总是,当有人围绕 log4net 创建 MyCompanyLogger 包装器时,他们会严重错过要点,并且会失去框架的重要且有用的功能,丢弃有用的信息,失去可能的性能增益甚至使用简化的 ILog 接口(interface),或以上所有接口(interface)。换句话说,包装 log4net 以避免与其耦合是一种反模式
</rant>

如果您觉得需要注入(inject)它,请通过属性访问您的记录器实例以启用注入(inject),但以老式方式创建默认实例。

至于在每条日志消息中包含上下文状态,您需要添加一个全局属性,其 ToString()解决您正在寻找的内容。例如,对于当前堆大小:

public class TotalMemoryProperty
{
public override string ToString()
{
return GC.GetTotalMemory(false).ToString();
}
}

然后在启动期间将其插入:

GlobalContext.Properties["TotalMemory"] = new TotalMemoryProperty();

关于design-patterns - 如何使用 log4net 进行依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/940831/

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