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 登录API_.net_Logging - Fatal编程技术网

.net 登录API

.net 登录API,.net,logging,.net,Logging,当我编写供其他人使用的API程序集时,使用一些日志功能来帮助诊断客户机的问题会很有用 但是,如果我在程序集中引用log4net,这可能会与客户端应用程序使用的log4net版本冲突 我不想通过编写自己的日志框架来重新发明轮子 解决我的困境的最好办法是什么 编辑:我想我可以要求将我正在使用的log4net的特定版本安装到GAC中,以避免版本与客户端冲突,但这将使API成为一个需要安装而不是插入程序集的胖东西。使用。它足够灵活,使用内置记录器和自己的记录器。它也与verison相当兼容。它是可配置的

当我编写供其他人使用的API程序集时,使用一些日志功能来帮助诊断客户机的问题会很有用

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

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

解决我的困境的最好办法是什么


编辑:我想我可以要求将我正在使用的log4net的特定版本安装到GAC中,以避免版本与客户端冲突,但这将使API成为一个需要安装而不是插入程序集的胖东西。

使用。它足够灵活,使用内置记录器和自己的记录器。它也与verison相当兼容。它是可配置的,如果与某个特定组件发生冲突,您可以轻松地将其替换掉,只需更改配置即可。

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

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

  • 引用Common.Logging在您的类中使用它就像log4net一样
  • 框架的使用者将配置Common.Logging以使用log4net,如下所示:


.... 正常的log4net配置在这里。。。
如果客户机也直接使用SpringFramework或Common.Logging,冲突仍有可能发生,但由于以下原因,冲突几率大大降低:

  • 日志团队正在努力确保未来版本与过去版本的向后兼容性。例如,2.0与1.2完全二进制兼容
  • 通用。至少在理论上,日志记录的更改频率低于log4net

使用依赖项注入(Unity、Castle Windsor等)来指定log4net dll使用的方式如果客户端使用的是旧版本,您可以插入该版本的log4net,如果他们没有,则提供您自己的版本

使用
System.Diagnostics.Trace
。那就不可能有版本冲突了

如果您想在外部将日志信息共享给使用它的人,那么使用这样的服务是值得的(免责声明,我在那里工作)-它可以让您写出日志和流量信息,并为开发人员提供一个界面来查看统计信息、错误、api密钥,它们可能达到的速率限制等。它还为您聚合了这些内容,因此您可以将其放在一个位置。

此API不会被放入自己的库中?如果客户端也使用Common.Logging,或者他们使用的是NHibernate或Spring.Net,该怎么办。这难道不能在Common.Logging.dll版本中引入冲突的可能性吗?普通应用程序不应该使用Common.Logging,只有框架应该使用。如果他们使用NH或SF,冲突是可能的,尽管很常见。日志记录的更改频率低于log4net。即使如此,如果您遇到这个问题,您也可以使用app.config魔法,允许应用程序加载同一DLL的两个不同版本。或者你可以用一个不同的名字来创建你的自定义的Common.Logging。事实上,我的缺点是,NH仍然直接使用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>