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

时间:2011-01-16 04:17:26

标签: .net logging

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

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

假定一些人认为,过度的程序集引用是烦人(和因为有人会提到它),我个人而言,我不喜欢使用ILMerge对于这种情况,你可以很容易地有使用几个库log4net的和如果他们每个ILMerged在程序集中,我认为它只是膨胀一个应用程序的大小。

为此,我正在考虑实现和公开一个LogBridge,以便我的库的用户可以根据需要挂钩我的日志记录调用(默认情况下会关闭)。 也让我说,我说的不是实现我自己的日志框架,只是保证如果有人关心comsuming它,我揭露登录强调的我想消费的实现似乎是这样的:

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);      }
  }
}

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

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

更新

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

2 个答案:

答案 0 :(得分:2)

查看System.Diagnostics并使用Trace或Debug类。像Log4Net这样的产品可以在需要时选择它们。

答案 1 :(得分:1)

我通常这样做:

  1. 提供用于记录的界面:ILogger
  2. 创建用于获取记录器的记录器工厂:ILogger _logger = LogManager.GetLogger(typeof(ClassBeingLogged));
  3. 提供一个基本实现,例如ConsoleLogger。
  4. 您还可以在项目维基中提供示例,说明如何实施nlog或log4net。这通常就够了。

    LogManager需要ILogFactory,负责创建实际的实现:

    public class LogManager
    { 
        ILogFactory _factory;
    
        public static void Assign(ILogFactory factory);
        public static ILogger GetLogger(Type typeBeingLogged);
    }
    
    public interface ILogFactory
    {
        ILogger GetLogger(Type typeBeingLogged);
    }
    

    这使得为任何日志框架实现适配器变得非常容易。