实现开源库:如何处理日志记录?

Chr*_*ter 5 .net logging

我正在我正在开发的开源库中实现日志记录支持.大多数第三方库似乎明确选择了"首选"日志库,如Log4NetNLog等,然后要求其库的消费者"处理它".值得庆幸的是,我们有一个像Common.Logging这样的库,可以在我们的消费应用程序中解决这个问题,这些应用程序统一了这些第三方库日志记录实现.

我打算尝试避免从我自己的开源库引用另一个第三方库,以避免将另一个程序集引用引入其他人的应用程序.也许这不是一个问题,我应该停在那里?

假设有些人认为过多的程序集引用令人讨厌(并且因为有人会提到它),我个人认为,我不喜欢在这种情况下使用ILMerge,因为你可能很容易有几个使用Log4Net的库,如果它们各自ILMerged在程序集中,在我看来,它只是膨胀了应用程序的大小.

为此,我正在考虑实现和公开一个LogBridge,以便我的库的用户可以根据需要挂钩我的日志记录调用(默认情况下会关闭).另外,请允许我强调,我不是在讨论实现自己的日志记录框架,只是确保在有人关注它的情况下公开日志记录.我认为消费实现会出现类似于:

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);      }
  }
}
Run Code Online (Sandbox Code Playgroud)

这种方法有意义吗?在度假太久之后,我是不是在想这个,我应该参考Log4NetNLog等,并完成它?我错过了这种方法的主要缺点吗?粗糙的API有意义吗?

一如既往,好奇每个人的想法......

更新

好奇,如果人们认为jgauffin解决方案是更好的方法吗?在这篇文章之前我已经考虑过了一些事情; 我的想法是LogBridge更容易与消费者联系,而不是要求在消费项目中实现自定义界面?思考?

Joe*_*orn 2

查看 System.Diagnostics 并仅使用 Trace 或 Debug 类。Log4Net 等产品可以在需要时获取这些信息。