【问题标题】:Could not load file or assembly 'log4net无法加载文件或程序集'log4net
【发布时间】:2009-04-20 15:59:16
【问题描述】:

好的,在将我们的一个 Web 应用程序部署到我们的实时服务器时,我遇到了一个非常奇怪的问题。

我们的应用程序使用 log4net 大量记录大量操作,在部署几个小时后,我们得到以下异常。

无法加载文件或程序集 'log4net, Version=1.2.9.0, Culture=neutral, PublicKeyToken=b32731d11ce58905' 或其依赖项之一。访问被拒绝。

以下是我使用的相关 web.config 添加内容。

<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>

<log4net>
    <appender name="ErrorLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="D:\SomeLocation\Errorlog"/>
      <param name="AppendToFile" value="true"/>
      <param name="RollingStyle" value="Size"/>
      <param name="maxSizeRollBackups" value="-1" />
      <param name="maximumFileSize" value="100MB" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/>
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="FATAL" />
        <param name="LevelMax" value="FATAL" />
      </filter>
    </appender>
    <appender name="BookingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="D:\SomeLocation\BookingInfoLog"/>
      <param name="AppendToFile" value="true"/>
      <param name="RollingStyle" value="Size"/>
      <param name="maxSizeRollBackups" value="-1" />
      <param name="maximumFileSize" value="100MB" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/>
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="INFO" />
        <param name="LevelMax" value="FATAL" />
      </filter>
    </appender>
    <root>
      <level value="ALL"/>
      <appender-ref ref="BookingLogFileAppender"/>
      <appender-ref ref="ErrorLogFileAppender"/>
    </root>

  </log4net>

它在我们的本地机器和开发服务器上运行良好,但不是在现场。

顺便说一句,在 web.config 更新或应用程序池回收之后,JIT 编译器在服务器上运行后似乎会中断,甚至只是很长一段时间!

更新:我们的实时服务器从一个共享位置运行所有网站。我设法在从共享运行应用程序的另一台服务器上复制了这个问题。将站点设置为从本地驱动器运行时,问题消失了,但我们的托管要求我们从共享运行。为什么 log4net 会从共享运行权限问题的任何想法。再次运行应用程序,直到发生另一个 JIT 编译

【问题讨论】:

  • 我遇到的问题和你一模一样。你有没有为此找到解决方案?

标签: c# .net web-config log4net


【解决方案1】:

当我们迁移到 VS 2010 和 .NET 4.0 时,我们也遇到了这个问题,我们根本不使用 log4net,但我怀疑我们使用的其他东西(可能是 Crystal Reports?)而且我还怀疑有一个 dll我们也使用 32 位 dll,因为当我将 IIS 中应用程序池的高级设置下的“启用 32 位应用程序”选项更改为“真”时,一切都恢复正常了。

【讨论】:

  • 谢谢。我只是遇到这个问题,你的回答有帮助。但是,奇怪的是,我遇到了相反的问题。我将“启用 32 位应用程序”设置为“True”,当我将其设置为“False”时它又开始工作了。
  • 注:根据马特的评论。 Crystal Reports 正在调用 log4net。
【解决方案2】:

可能问的很明显,但我假设你的 bin 文件夹中的 log4net.dll 是正确的版本?

如果您有多个项目引用同一个 DLL 的不同版本,那么后面的项目将 DLL 复制到先前版本的情况并不少见。

假设您需要支持多个 log4net 副本,我能想到的最佳解决方案是在您的配置中添加探测并将此版本放在另一个文件夹中。

http://msdn.microsoft.com/en-us/library/823z9h8w.aspx

【讨论】:

  • 这很有趣,我们确实有几个项目使用 log4net 在该服务器上运行。我很确定他们使用相同的版本,但我会尝试你的建议。即便如此,为什么从本地驱动器运行项目可以正常工作,但不能从共享运行?
  • 默认情况下,共享只是一个部分受信任的位置,您可以将其添加为完全信任,我忘记了命令提示符名称,但有“.NET Framework 2.0 配置”mmc 管理单元可以配置它给你。您能否确认您的 bin 文件夹中的 log4net 版本是 1.2.9.0 版本并且公钥是正确的?您可以右键单击该文件并选择属性进行查找。
  • 虽然我没有使用 log4net.dll 作为参考,但它在我的 bin 文件夹中。删除后,我不再收到 500 错误...
【解决方案3】:

检查您在编译时绑定的版本(您的文件引用)和运行时使用的版本(首先查看 GAC,然后查看本地)

通常,GAC 中的版本与您作为文件参考的版本不同。请检查一下。

同时清理 ASP.NET 临时目录并执行 IIS 重启(cmd 提示符 -> iisreset)

【讨论】:

  • 但是如果我们不引用 GAC,我们只是引用 dll。也许我对 GAC 的理解不正确?
  • 参考程序集始终是构建时的,GAC 始终是运行时的。单击 C# 项目中引用的程序集。看签名。然后查看 GAC,检查程序集名称是否在那里注册。如果是这样,请检查两个版本(您引用的版本和 GAC 中的版本)。当它们不同时,您就会遇到问题
【解决方案4】:

我敢打赌,您的 JIT 编译器对共享没有写入权限。 JIT 编译器似乎不时地重新编译整个站点,也许是在它被回收时。

一种选择是部署预先构建的站点。这样就不用重新编译了。另一种选择是您将 JIT 编译器的写入权限授予您的共享。很可能它与运行您的 Web 服务的用户是同一用户,例如。 SYSTEM、NETWORK SERVICE 或 LOCAL SERVICE 组或 IIS_* 用户之一...

【讨论】:

    【解决方案5】:

    我遇到了同样的问题,如果您使用 GIT,这可能会对您有所帮助。

    问题原来是我的 Log4net.dll 文件位于一个名为 log 的文件夹中。 .gitignore 配置文件(默认情况下)排除所有名为 log 的文件夹。

    【讨论】:

      猜你喜欢
      • 2014-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多