【发布时间】:2011-09-15 18:27:15
【问题描述】:
我一直在使用 C# 开发一个库,并希望为其提供自动记录所有异常的功能。理想情况下,我希望它使用 log4net,从而允许客户端以他们喜欢的方式配置日志(即他们可以将其重定向到 EventLog 或数据库或你有什么)。
但是,如果他们选择不使用日志记录功能,我想避免依赖日志记录。这可行吗?
换句话说,有没有一种方法可以让我有一个 log4net 依赖项,这取决于客户端在配置文件中设置的内容?
【问题讨论】:
我一直在使用 C# 开发一个库,并希望为其提供自动记录所有异常的功能。理想情况下,我希望它使用 log4net,从而允许客户端以他们喜欢的方式配置日志(即他们可以将其重定向到 EventLog 或数据库或你有什么)。
但是,如果他们选择不使用日志记录功能,我想避免依赖日志记录。这可行吗?
换句话说,有没有一种方法可以让我有一个 log4net 依赖项,这取决于客户端在配置文件中设置的内容?
【问题讨论】:
显而易见的答案是将System.Diagnostics.Trace 子系统与自定义TraceSource 一起使用。这样您就可以在配置文件中设置任何您想要的TraceListener,包括log4net、EventLog、文本文件、Console 或XML 文件。
如果您添加了 log4net TraceListener,则依赖项将在运行时加载,而不是编译。Trace 子系统从一开始就变得非常强大,我建议您研究一下。
【讨论】:
您可以使用 .NET 中已经内置的跟踪子系统 - 它是受配置控制的。
我自己不会添加依赖项 - 只需通过跟踪 API 发出消息 - 客户端可以根据需要决定如何记录它们。
【讨论】:
比起System.Diagnostics.Trace提供的,我个人更喜欢Log4Net API。
所以我有自己的抽象层,它使用提供者模型设计模式,并公开类似于 log4net 的 API。然后我可以插入一个 log4net 提供程序,但将来可以随意用不同的提供程序(例如 System.Diagnostics.Trace;EntLib)替换它。
实现与this one非常相似。
通过这样做,应用程序不会直接依赖于底层日志记录提供程序,如果您(或您的客户)有其他偏好,您可以轻松切换到不同的提供程序。
【讨论】: