【发布时间】:2011-01-16 04:17:26
【问题描述】:
我正在我正在开发的开源库中实现日志记录支持。大多数第 3 方库似乎明确选择了“首选”日志库,例如 Log4Net 或 NLog 等,然后要求其库的使用者“处理它”。值得庆幸的是,我们有一个像 Common.Logging 这样的库来解决我们的消费应用程序中的这个问题,它统一了这些 3rd 方库日志记录实现。
我将尝试避免从我自己的开源库中引用另一个 3rd 方库,以避免将另一个程序集引用引入其他人的应用程序。也许这不是问题,我应该就此打住?
假设有些人同意过多的程序集引用很烦人(并且因为有人会提到它),我个人不喜欢在这种情况下使用 ILMerge,因为您可能很容易拥有多个使用 Log4Net 的库和如果他们每个人都在程序集中进行了 ILMerged,那么在我看来,这只是增加了应用程序的大小。
为此,我正在考虑实现和公开一个 LogBridge,以允许我的库的使用者在需要时连接到我的日志记录调用(默认情况下会关闭)。 另外让我强调一下,我不是在谈论实现我自己的日志框架,只是确保我在有人担心使用它时公开日志记录。我认为消费实现看起来像这样: p>
public class SomeSetupClass
{
private void SomeSetupMethod()
{
var log = LogManager.GetLogger("LogSourceName");
var logBridge = new LogBridge()
{
DebugEnabled = log.IsDebugEnabled,
InformationEnabled = log.IsInfoEnabled,
WarningEnabled = log.IsWarnEnabled,
ErrorEnabled = log.IsErrorEnabled,
CriticalEnabled = log.IsFatalEnabled
};
logBridge.DebugMessageReceived += (sender, e) => log.Debug(e.Message);
logBridge.InformationMessageReceived += (sender, e) => log.Info(e.Message);
logBridge.WarningMessageReceived += (sender, e) => log.Warn(e.Message);
logBridge.ErrorMessageReceived += (sender, e) => log.Error(e.Message);
logBridge.CrticalMessageReceived += (sender, e) => log.Fatal(e.Message); }
}
}
这种方法有意义吗?在假期太久之后我是否过度思考这个问题,我应该参考Log4Net 或NLog 等并完成它?我错过了这种方法的任何主要缺点吗?粗略的 API 有意义吗?
一如既往,好奇大家的想法……
更新
好奇人们是否认为 jgauffin 解决方案是更好的选择?在这篇文章之前我已经考虑过了;我的想法是 LogBridge 更容易为消费者连接,而不是需要在消费项目中实现自定义接口?想法?
【问题讨论】:
-
这样的事情很有意义。那里有许多日志框架——有些比其他的好。每个人都有自己的最爱。通过在你做的时候提供一个很好的钩子,你不会把任何东西塞进任何人的喉咙里,而且你提供了极好的灵活性。