【问题标题】:log4net logger defined in base class基类中定义的 log4net 记录器
【发布时间】:2012-08-14 01:37:07
【问题描述】:

我想在我的 MVC 控制器抽象基类中构建我的 log4net 记录器,如下所示:

protected static readonly ILog Log = LogManager.GetLogger(typeof(AuthorizedController));

通过这种方式,我可以定义一次记录器并完成它。唯一的问题是日志输出中的 logger 属性将始终为AuthorizedController,如果我有从AuthorizedController 继承的FooController,我希望日志输出能够反映这一点。

什么是一个好的 KISS、DRY 和有效的方法来做到这一点?

【问题讨论】:

  • 游戏中有一些 IoC 库吗?

标签: c# inheritance logging static log4net


【解决方案1】:

我不确定调用LogManager.GetLogger() 的成本有多高,但我怀疑log4net 系统中有一些巧妙的缓存和/或延迟初始化,可以使请求的实例保持可用于快速检索。毕竟,没有理由使用相同的类型参数调用 LogManager.GetLogger() 两次会返回不同的实例。

也就是说,也许用以下属性替换该字段就足够了。

protected ILog Logger
{
    get { return LogManager.GetLogger(GetType()); }
}

GetType() 是虚拟的且重载的,因此每个具体类型都会在调用此属性时提供其类型。

【讨论】:

  • Retrieves a logger named as the name parameter. If the named logger already exists, then the existing instance will be returned. Otherwise, a new instance is created.
  • 是的,我觉得我太拘泥于静态实例了,其实它并不需要是静态的。
  • Log4net 从 Hashtable 读取以解析记录器。 O(1) 还不错,但我不喜欢每次需要访问 Logger 时都进行多个方法调用。也许最好的想法是让每个派生类在其构造函数中调用此属性并保存记录器本身的副本。
  • 恒定时间“还不错”?除了代码中的样板代码更加混乱之外,还有什么功能上的区别吗?
【解决方案2】:

我通过使用NInject 作为 IoC 容器做了类似的事情,但我想你可以抓住这个想法来使用你自己的容器。 基本上我在请求类型构造函数上注入 ILog,但不是绑定到实例,I bind it to a provider

  kernel.Bind<ILog>().ToProvider<MyProvider>();

public object Create(IContext context)
{
    return LogManager.GetLogger(context.Request.Target.Member.DeclaringType);
}

所以每种类型都会收到一个与构造函数中的GetLogger(GetType()) 相同的记录器。

【讨论】:

  • 我将不得不对此进行进一步调查,但目前史蒂夫的回答就足够了。
【解决方案3】:

拥有静态记录器(或一般的静态实例)是一种不好的做法。它很容易导致不相关的组件之间出现不希望的耦合。

您应该考虑在游戏中添加依赖注入/控制逆向框架。将记录器注入到类的 ctor 中。大多数框架允许您在不同的上下文中定义不同的实现。

我们在产品中使用Castle Windsor

您还可以查看this post 以找到将日志记录与 DI 一起使用的示例

【讨论】:

【解决方案4】:

正如 Steve Guidi 所建议的 - 使用 GetType 为特定类型的实例创建记录器。您可以保存对在支持字段中调用 LogManager.GetLogger 的记录器实例的引用:

    private ILog _log;
    protected ILog Log => _log ?? (_log = LogManager.GetLogger(GetType()));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 2018-01-17
    • 2013-11-26
    • 1970-01-01
    • 2010-12-29
    相关资源
    最近更新 更多