没有日志记录库的日志记录

时间:2011-04-06 00:17:53

标签: .net architecture logging

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

对于库用户来说,记录输出并不重要,除非他或她真的想看到调试/信息输出。在这种情况下,他将安装log4net并告诉库通过配置文件以某种方式使用它。否则我想发送我的库而没有任何不相关的依赖。这可能吗?有什么选择?

在C ++中,我只需创建几个dll / so(有和没有日志记录)静态链接它们与所需的库集,如果有人需要一个启用了日志的库,他只需用另一个版本覆盖它。 / p>

5 个答案:

答案 0 :(得分:4)

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

DotNetOpenAuth执行此操作

我知道DotNetOpenAuth库的行为与您描述的方式相同。它使用log4net,但仅当它由消耗组件存在和配置时才使用。来自README.Bin.html:

  

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

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

<强> [编辑] 我检查了他们的源代码,他们动态检查log4net程序集并加载+连接它(如果存在)(在Log4NetLogger.cs&amp; Logger.cs中)。正如您在下面的评论中所提到的,它们在编译期间需要log4net,因为它在几个地方被引用。聪明的部分是,因为当检查失败时会跳过所有特定于log4net的代码,当缺少log4net程序集时将没有运行时问题。

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

答案 1 :(得分:3)

这是一个很好的跟踪介绍,这是我喜欢使用的,组装的消费者也可以使用它。

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

答案 2 :(得分:1)

我能看到的唯一选择是用你的应用程序完全封装一些东西;两个选项:

  • 采用开源日志记录框架并将其源代码烘焙到您的应用程序中(因此当有人安装您的应用程序时,他们也无意中安装了记录器)。这里的假设是你的安装过程将涵盖所需的任何东西,或者你以一种没有(重大)暴露给它们的方式进行烘焙。
  • 采用日志框架并将其添加到您的项目中,但仅作为一个干净的依赖项 - 而不是在代码级别“烘焙”这么多。例如,您可以使用MS EntLibs执行此操作,并通过提供默认配置(并在您的intstall进程中包含EntLib DLL),您可以成功地保护用户不必执行任何操作。

但最重要的是(据我所见),log(config)通常是人们需要在某些时候弄乱的东西,因为它通常是特定于环境的,所以我怀疑你可以保护所有用户不必一直都知道这件事。

答案 3 :(得分: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

答案 4 :(得分:0)

您可以考虑使用具有足够广泛的再分发许可证的日志记录库,该许可证允许您将其与源代码一起分发。大多数基于BSD的许可证允许您这样做。

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