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