为什么log4net 1.2.10需要System.Web?

时间:2011-06-08 15:44:17

标签: .net log4net

我在针对.NET Framework 4客户端配置文件的控制台应用程序中编写此代码。

this.container.AddFacility<LoggingFacility>(
  f => f.LogUsing(LoggerImplementation.Log4net));

运行时,它会因类型转换错误而失败。

  

无法转换为'Castle.Services.Logging.Log4netIntegration.Log4netFactory,Castle.Services.Logging.Log4netIntegration,Version = 2.5.1.0,   文化=中性公钥= 407dd0808d44fbdc”   到System.Type - 也许类型不能   找到了

这是因为Castle.Services.Logging.log4netIntegration程序集未复制到输出文件夹。作为仅限运行时的依赖项,这不会破坏构建。

查看构建过程,我发现它没有复制log4net或Castle工具程序集,因为它们依赖于Client.Web,而Client.Web在客户端配置文件中不可用。更改为标准配置文件意味着此依赖关系可用,并且可以添加设施。

为什么要这样做?如果我没有将控制台应用程序中的客户端配置文件作为服务器上的计划任务使用,那么它有何不同?

2 个答案:

答案 0 :(得分:7)

某些appender依赖于System.Web,例如AspNetTraceAppender。开发人员可用的唯一其他选项是将不依赖于System核心的组件拆分为单独的程序集,但这会破坏log4net的优点,因为它使用起来非常简单。此外,在编写log4net时,我不相信他们是客户档案。

由于log4net是开源的,因此没有什么可以阻止您下载源代码并删除有问题的类并创建自己的以客户端配置文件为中心的log4net程序集。

http://www.thecodeking.co.uk/2010/08/making-log4net-work-with-net-client.html

  1. 下载log4net源
  2. 开放&amp;使用Visual Studio 2010升级解决方案
  3. 删除System.Web项目参考
  4. 从项目中排除Appender \ AspNetTraceAppender.cs类
  5. 添加对System.Configuration的引用
  6. 导航至项目 - &gt; log4net属性,然后选择应用程序选项卡
  7. 将目标框架更改为.NET Framework 3.5 Client Profile
  8. 选择“构建”选项卡,然后将配置更改为“调试”
  9. 在条件编译符号下,将其更改为NET; NET_1_0; NET_2_0;
  10. 将配置更改为发布
  11. 在条件编译符号下,将其更改为STRONG; NET; NET_1_0; NET_2_0;
  12. 编辑AssemblyInfo.cs类并使用有效的强密钥
  13. 更新AssemblyKeyFile属性
  14. 在发布模式下编译项目并分发新程序集

答案 1 :(得分:-4)

以下是我的想法:Log4Net使用System.Web,因为开发人员认为这是最好的选择。

如果您不想要这个权重,请考虑一个不需要System.Web的日志记录项目。还有其他选择。