登录API

时间:2009-07-09 15:39:46

标签: .net logging

当我为其他人编写API程序集时,有一些日志记录功能可以帮助诊断使用它的客户端问题。

但是,如果我在程序集中引用log4net,这可能会与客户端应用程序使用的log4net版本冲突。

我不想通过编写自己的日志框架来重新发明轮子。

解决我的困境的最佳方法是什么?

编辑:我想我可以要求将我正在使用的特定版本的log4net安装到GAC中以避免与客户端的版本冲突,但这会使API变得很重要,需要安装而不是丢弃 - 在集会中。

6 个答案:

答案 0 :(得分:4)

看看SpringFramework如何解决这个问题。它使用Common.Logging,然后可以通过配置文件将其映射到log4net或任何其他自定义日志记录框架。您可以在Common.Logging website上找到更多详细信息,但基本上您可以执行以下操作:

  • 参考Common.Logging在您的类中使用它就像log4net
  • 框架的使用者将Common.Logging配置为使用log4net,如下所示:

  <configSections>
    <sectionGroup name="common">
      <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />
    </sectionGroup>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>

  <common>
    <logging>
      <factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net">
        <arg key="configType" value="INLINE" />
      </factoryAdapter>
    </logging>
  </common>

  <log4net>
.... normal log4net configuration goes here...
  </log4net>

如果客户端也直接使用SpringFramework或Common.Logging,则冲突仍然存在,但由于以下原因,其可能性大大降低:

  • Common.Logging团队正在努力确保未来版本与过去版本的向后兼容性。例如,2.0与1.2完全二进制兼容。
  • Common.Logging变化的频率低于log4net,至少在理论上是

答案 1 :(得分:2)

使用Enterprise Library。它足够灵活,并且使用内置记录器和它自己的记录器。它也具有相当的verison兼容性。它的配置足够,如果与特定组件发生冲突,只需更改配置即可轻松将其交换出来。

答案 2 :(得分:2)

使用System.Diagnostics.Trace。没有版本冲突的可能性!

答案 3 :(得分:1)

这是依赖注入是你的朋友的地方 - 你可能不需要使用所有的log4net,而是使用它的一些小部分。因此,在您的应用程序中编写一个ILogger类,公开您的功能,然后为您要使用的任何记录器编写实现。例如,Debug.Trace()记录器非常适合开发或调试工作,而您可能需要一个log4net驱动程序来进行生产。然后使用依赖注入(例如StructureMap)在生产代码中插入记录器的实例。

答案 4 :(得分:0)

使用依赖注入(Unity,Castle Windsor等)来指定如果客户端使用的是旧版本的log4net dll,你可以只插入log4net的版本,如果他们没有它然后提供你自己的。

答案 5 :(得分:0)

如果你想在外部与使用它的人共享日志信息,那么值得使用像3scale这样的服务(免责声明,我在那里工作) - 它可以让你写出日志和流量信息并给予开发人员一个界面,可以查看统计数据,错误,api-keys,他们可能会遇到的速率限制等。它还可以为您聚合这些东西,让您拥有一个位置。