2011-04-06 181 views
5

这是“问题”。我开发的每个库都记录了一些东西,但是我不想要求库用户知道这一点,并安装我将使用的log4net或类似的日志记录实现。聪明人如何创建独立程序集?没有日志库的日志记录

记录输出对图书馆用户来说并不重要,除非他或她真的想看到调试/信息输出。在这种情况下,他会安装log4net并告诉库以某种方式通过配置文件使用它。否则,我想运送我的图书馆没有任何不相关的依赖关系。这可能吗?有什么选择?如果有人需要一个启用了日志记录的库,他会简单地用另一个版本覆盖它。在C++中,我会简单地创建一对dll/so(带和不带日志记录)。

+0

那么你在内部使用log4net?为什么你不允许用户指定他/她想要使用的日志记录方法? – Kyro 2011-04-06 00:25:55

+0

是的,它确实隐含地引用它。一般来说,我使用我自己的抽象日志界面。所以也许我可以动态加载一个适当的日志库,如log4net。同样,我需要在所开发的所有库中共享ILog接口,所以我必须再次至少发布MyLibrary.dll + MyCompany.Logging.dll :( – 2011-04-06 00:28:37

回答

4

好主意;像这些东西是使图书馆的作者和消费者的生活更轻松的细节!

DotNetOpenAuth做到这一点

我知道DotNetOpenAuth库的行为你描述的方式。它使用log4net,但只有当它出现并由消费组件配置时。从它的README.Bin.html:

log4net.dll如果存在与V1.2.10, 将允许记录日志消息 这个库发出。

还有你自己的应用程序中的an informative page on how to configure DotNetOpenAuth logging

[编辑] 我检查他们的源代码,和它们动态地检查log4net的组件和负载+线如果存在的话(在Log4NetLogger.cs & Logger.cs)它。正如你在下面的评论中所提到的,他们在编译期间需要log4net,因为它在几个地方被引用。巧妙的部分是,因为当检查失败时,所有log4net特定的代码被跳过,当log4net程序集丢失时,运行时会出现问题

DotNetOpenAuth是一个开源项目,所以你应该能够通过浏览他们的初始化代码来模仿他们的方法。

+0

我只是看了一下github,项目文件的确引用了log4net: ... False ... 和库从log4net.dll导入类型。我没有检查,如果没有运行时创建log4net.dll和log4net记录器是否工作。可以? – 2011-04-06 11:56:44

3

这是一个很好的跟踪介绍,这是我更喜欢使用的,并且您的程序集的消费者也可以使用它。

http://www.devx.com/codemag/Article/22040

+0

同意,没有使用'Trace'但是像往常一样,一天中的无知规则,CodePlex甚至有一个包,你可以使用更多的跟踪提供商 – 2011-04-06 02:02:48

+0

好主意,谢谢,我认为大多数人忽视,因为它更容易登录到控制台(无需配置跟踪)或者因为内置的跟踪功能与log4net相比没有那么强大 – 2011-04-06 11:48:35

1

我可以看到的唯一选择是完全封装与您的应用程序的东西;两种选择:

  • 拿一个开源日志框架和烘烤它的源代码到你的应用程序(所以当有人安装您的应用,他们也在不经意间安装了记录仪)。这里的假设是,你的安装过程可以覆盖任何需要的东西,或者,你以没有(显着)暴露给他们的方式来烘焙它。
  • 取一个日志框架并将其添加到您的项目中,但只是作为一个干净的依赖关系 - 而不是在代码级别“烘烤”。例如,您可以使用MS EntLibs执行此操作,并通过提供默认配置(并在IntSTall进程中包含EntLib DLL),您可以成功屏蔽用户无需执行任何操作。

尽管(尽我所见),底线是logging(config)通常是人们在某些时候需要弄的东西,因为它通常是特定于环境的,所以我怀疑你可以屏蔽所有用户从不必一直知道任何事情。

1

我刚碰到同样的问题。我的库只有78KB,但需要238KB的log4net依赖。所以我写了一个抽象类动态加载log4net的,只有当存在这样的:

static Logger() { 
     try { 
      Assembly.Load("log4net"); 
      _loggingIsOff = false; 
     } catch {} 
    } 

    public static ILog CreateLog() { 
     var frame = new System.Diagnostics.StackFrame(1, false); 
     var type = frame.GetMethod().DeclaringType; 
     return _loggingIsOff ? (ILog)new NoLog() : new Log4NetLogger(type); 
    } 
    ... 
} 

链接到完整的代码here

0

你可能会考虑包括日志库有足够广泛分发许可,允许你将它与你的源代码一起分发。大多数基于BSD的许可证将允许你这样做。

我很有偏见,但http://www.logog.org可能会根据一些相当广泛的许可条款重新分配,并且可能符合您的要求。