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

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

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

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

最佳答案

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

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

protected ILog Logger
{
    get { return LogManager.GetLogger(GetType()); }
}
GetType()是虚拟的并且已重载,因此每种具体类型都将在调用此属性时提供其类型。

关于c# - 在基类中定义的log4net记录器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12008592/

10-10 23:12