Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 实现开源库:如何处理日志记录?_.net_Logging - Fatal编程技术网

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

.net 实现开源库:如何处理日志记录?,.net,logging,.net,Logging,我正在一个开源库中实现日志支持。大多数第三方库似乎明确选择了一个“首选”日志库,如或等,然后要求其库的消费者“处理它”。谢天谢地,我们的消费应用程序中有一个类似于解决这个问题的库,它统一了这些第三方库日志记录实现 我打算尽量避免引用我自己的开源库中的另一个第三方库,以避免将另一个程序集引用引入到其他人的应用程序中。也许这不是一个问题,我应该到此为止 假设有些人认为过多的程序集引用是令人讨厌的(因为有人会提到),我个人不喜欢在这种情况下使用ILMerge,由于您可能很容易拥有多个使用Log4Net

我正在一个开源库中实现日志支持。大多数第三方库似乎明确选择了一个“首选”日志库,如或等,然后要求其库的消费者“处理它”。谢天谢地,我们的消费应用程序中有一个类似于解决这个问题的库,它统一了这些第三方库日志记录实现

我打算尽量避免引用我自己的开源库中的另一个第三方库,以避免将另一个程序集引用引入到其他人的应用程序中。也许这不是一个问题,我应该到此为止

假设有些人认为过多的程序集引用是令人讨厌的(因为有人会提到),我个人不喜欢在这种情况下使用ILMerge,由于您可能很容易拥有多个使用Log4Net的库,并且如果它们都合并到程序集中,我认为这只会使应用程序的大小膨胀

为此,我考虑实现并公开一个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);      }
  }
}
这种方法有意义吗?假期太长了,我是否有过这样的想法,我应该只参考一下,或者等等,然后就了结了?我是否遗漏了这种方法的任何主要缺点?粗略的API有意义吗

像往常一样,好奇每个人的想法

更新

好奇人们是否认为jgauffin解决方案是更好的方法?在写这篇文章之前,我已经考虑过了;我的想法是,LogBridge将更容易为消费者连接,而不是要求在消费项目中实现自定义接口?想法?

我通常这样做:

  • 提供用于日志记录的界面:
    ILogger
  • 创建用于获取记录器的记录器工厂:
    ILogger\u logger=LogManager.GetLogger(typeof(ClassBeingLogged))
  • 提供基本实现,如ConsoleLogger
  • 您还可以在项目wiki中提供示例,说明如何实现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);
    }
    

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

    查看System.Diagnostics,只需使用跟踪或调试类即可。像Log4Net这样的产品可以在需要时选择这些产品。

    我已经考虑过这种方法;我认为主要的缺点是用户必须实现并注入日志接口的实现。我最初的印象是,对于消费者来说,这将比仅仅将他们现有的日志框架绑定到一个非常简单的logbridgeapi上要做更多的工作。尽管如此,正如您所指出的,项目Wiki中的示例是必须的。想法?通常只有两个类需要实现才能工作。您还可以创建一个ilmerge的nlog或log4net实现(我不是说您应该ilmerge log4net/nlog,而是框架的适配器),并在您的站点上提供单独的下载。用户仍然可以使用他们最喜欢的日志框架,因为主下载只定义了接口。有很多日志框架——有些比其他更好。每个人都有自己的最爱。通过提供一个漂亮的钩子,你不会把任何东西压到任何人的喉咙里,你提供了极好的灵活性。是的,我也考虑过这个。我研究了如何实现CustomTraceListener,尽管您可以覆盖TraceEvent的处理;API似乎期望您在丢失TraveEventLevel时重写写/写线。Issue/Non Issue?Non Issue--您继承自基本跟踪侦听器,因此您仍然可以构建WriteLine()方法来考虑这一点(如果您愿意的话)。。。那是我最初的计划。。。当我看到写/写是抽象的并且必须被推翻时,才开始考虑另一种选择…谢谢你的意见。