log4net logger在基类中定义

Jer*_*acs 14 c# inheritance logging log4net static

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

protected static readonly ILog Log = LogManager.GetLogger(typeof(AuthorizedController));
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我可以定义一次记录器并完成它.唯一的问题是日志输出中的logger属性将永远是AuthorizedController,如果我FooController继承了AuthorizedController我想像日志输出那样反映.

这样做会有什么好的KISS,DRY和高效方式?

Ste*_*idi 18

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

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

protected ILog Logger
{
    get { return LogManager.GetLogger(GetType()); }
}
Run Code Online (Sandbox Code Playgroud)

GetType() 是虚拟和重载,因此每个具体类型将在调用此属性时提供其类型.

  • `检索名为name参数的记录器.如果已存在指定的记录器,则将返回现有实例.否则,将创建一个新实例 (2认同)