无法加载文件或程序集“log4net”。

8

我在将我们的一个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>

在我们的本地机器和开发服务器上运行正常,但在线上却不行。

顺便提一下,在JIT编译器在服务器上运行后(无论是web.config更新、应用程序池回收还是长时间运行后),它似乎会出现问题!

更新:我们的生产服务器从共享位置运行所有网站。我成功地在另一台从共享运行应用程序的服务器上复制了此问题。将站点设置为从本地驱动器运行时,问题消失了,但我们的托管要求我们从共享位置运行。有什么想法,为什么log4net在从共享运行时会有权限问题。同样的应用程序在 JIT 编译再次发生之前都能正常运行。


我遇到了和你完全相同的问题。你最终解决了这个问题吗? - gabe
5个回答

8

当我们升级到VS 2010和.NET 4.0时,我们也遇到了这个问题,虽然我们没有使用log4net,但我怀疑我们使用的其他东西可能会用到它(也许是Crystal Reports?),我还怀疑我们使用的某个dll是一个32位的dll,因为当我在IIS中将应用程序池的高级设置下的“启用32位应用程序”选项更改为“True”时,一切又恢复正常了。


谢谢。我刚遇到这个问题,你的答案帮了我很大忙。但是奇怪的是,我的问题与你相反。我将“启用32位应用程序”设置为“True”,当我将其设置为“False”时,它又开始工作了。 - Bob
注意:根据Matt的评论,Crystal Reports正在调用log4net。 - John M

6

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

如果您有多个项目引用了相同DLL的不同版本,则后来的项目复制该DLL以覆盖先前的版本并不罕见。

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

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


很有趣,我们确实有几个正在使用log4net的项目在那台服务器上运行。我相当确定它们使用的是同一个版本,我会尝试您的建议。即便如此,为什么从本地驱动器运行项目可以正常工作,但从共享文件夹中运行就不行呢? - Sheff
共享文件夹默认只是部分信任的位置,你可以将其添加到完全信任列表中。我忘记了命令提示符的名称,但有“.NET Framework 2.0 Configuration”mmc插件可为您配置。请确认您bin文件夹中的log4net版本是否为1.2.9.0,并且公钥是否正确。您可以右键单击文件并选择属性以查找答案。 - Mark Broadhurst
虽然我没有将log4net.dll作为引用使用,但它在我的bin文件夹中。一旦删除,我就不再收到500错误了... - Cerveser

1

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

通常GAC中的版本与您作为文件引用的版本不同。请检查此项。

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


但是,如果我们不引用GAC,只引用dll。也许我的GAC理解有误? - Sheff
引用程序集是始终在构建时进行的,而 GAC 始终在运行时使用。单击 C# 项目中所引用的程序集。查看签名。然后查看 GAC,检查程序集名称是否已注册。如果是,请检查两个版本(您所引用的版本和 GAC 中的版本)。当它们不同时,就会有一个问题。 - Patrick Peters

0

我敢打赌你的JIT编译器没有对共享文件夹有写入权限。看起来JIT编译器会不时地重新编译整个网站,可能是在回收时。

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


0

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

问题的原因是我的Log4net.dll文件放在了一个名为log的文件夹中。而.gitignore配置文件默认排除所有名为log的文件夹。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接