【发布时间】:2011-01-24 15:00:44
【问题描述】:
我在我的应用程序(MVC3 Web 应用程序)中使用带有 log4net 的 Castle 日志记录工具。但是,我没有直接使用 ILogger 接口,而是通过创建另一个接口 (IAuditor) 来抽象它,并使用具体实现 Log4NetAuditor(参见下面的代码)。
您可能会问我为什么这样做,因为 ILogger 的目的是抽象底层的日志记录实现。我这样做是因为严格遵守 onion architecture 抽象所有基础架构问题的原则。
现在,除了所有记录器的名称都相同之外,这一切正常:MyProject.Infrastructure.Log4NetAuditor:
2011-01-24 13:26:11,746 [11] DEBUG MyProject.Infrastructure.Log4NetAuditor [] - Attempting login...
2011-01-24 13:26:11,845 [11] DEBUG MyProject.Infrastructure.Log4NetAuditor [] - Authentication result is Authenticated
IAuditor 作为 AuditableComponent 上的属性公开,它是一个抽象类,所有需要日志记录的组件都从该类派生。
public abstract class AuditableComponent
{
private IAuditor _auditor = NullAuditor.Instance;
public IAuditor Auditor
{
get { return _auditor; }
set { _auditor = value; }
}
//....
}
Log4NetAuditor 类如下所示:
public class Log4NetAuditor : IAuditor
{
private ILogger _logger = NullLogger.Instance;
public ILogger Logger
{
get { return _logger; }
set { _logger = value; }
}
public void Trace(string message)
{
_logger.Debug(message);
}
}
现在,为什么所有日志语句都具有相同的记录器名称的原因很清楚了:ILogger 被注入到 Log4NetAuditor 类中。
那么,如何确保记录器的名称与扩展 AuditableComponent 的类的名称相对应?
【问题讨论】:
-
你为什么不使用 LoggingFacility?它提供了 OOTB 的功能
-
您好 Krzystof,我正在使用 LoggingFacility。但是,我不希望在我的客户端应用程序中引用 ILogger(即 Windsor)。这就是 IAuditor 抽象的用武之地。
-
然后看看该设施是如何工作的,您可以复制它。它是 OSS 伴侣 - 您可以随意使用和修改该代码 :)
-
这是一个很好的建议,很明显我没有想到它 ;-) 我创建了一个工厂来为我解决问题,并在后台保留了对设施的使用,这样我的审核员可以将任何日志记录实现插入其中。好的!谢谢 Krzysztof!
标签: logging log4net asp.net-mvc-3 castle-windsor