首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >间歇性log4net RollingFileAppender锁定的文件问题该怎么解决?

间歇性log4net RollingFileAppender锁定的文件问题该怎么解决?
EN

Stack Overflow用户
提问于 2018-04-23 07:04:06
回答 2查看 0关注 0票数 0

当使用Visual Studio进行开发和调试时,我们会在VS输出窗口中获得以下log4net错误消息:

代码语言:javascript
复制
log4net:ERROR [RollingFileAppender] Unable to acquire lock on file C:\folder\file.log.

该进程无法访问文件'C:\ folder \ file.log',因为它正在被另一个进程使用:

代码语言:javascript
复制
log4net:ERROR XmlConfigurator: Failed to find configuration section 'log4net' in the application's .config file.
Check your .config file for the <log4net> and <configSections> elements.

配置部分应该如下所示:

代码语言:javascript
复制
<section
  name="log4net"
  type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />

我们的log4net配置部分如下所示:

代码语言:javascript
复制
<log4net>
  <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="C:\folder\file.log"/>
    <appendToFile value="true" />
    <datePattern value="yyyyMMdd" />
    <rollingStyle value="Date" />
    <maximumFileSize value="10MB" />
    <maxSizeRollBackups value="100" />
    <layout type="log4net.Layout.PatternLayout">
      <header value="[Header]&#xA;"/>
      <footer value="[Footer]&#xA;"/>
      <conversionPattern value="%date %-5level %logger ${COMPUTERNAME} %property{UserHostAddress} [%property{SessionID}] - %message%newline"/>
    </layout>
  </appender>
  <root>
    <level value="INFO"/>
    <appender-ref ref="RollingLogFileAppender"/>
  </root>
</log4net>
EN

回答 2

Stack Overflow用户

发布于 2018-04-23 15:31:56

你可以尝试这样来添加:

代码语言:javascript
复制
<lockingModel type =“log4net.Appender.FileAppender + MinimalLock”/>

到你的<appender />元素。这对性能有一定的影响,因为这意味着log4net会锁定文件,写入文件并为每个写入操作解锁。

默认行为的一个含义是,如果您在同一台计算机上运行的多个工作进程下正在执行的Web站点下使用它,则每个人都将尝试无限期地获取并保持该锁,其中两个是只会失去。将锁定模型更改为最小锁定可解决此问题。

票数 0
EN

Stack Overflow用户

发布于 2018-04-23 16:43:36

你需要注意log4net FAQ:

我如何获得多个进程登录到同一个文件? 在开始尝试提供任何替代方案之前,问问自己是否真的需要让多个进程登录到同一个文件,然后不要这样做;-)。 FileAppender为这个用例提供可插入的锁定模型,但所有现有的实现都有问题和缺点。 默认情况下,FileAppender在日志记录过程中对日志文件保持独占写入锁定。这可以防止其他进程写入文件。这种模式已知可以在Linux上(至少在某些版本的)Mono上发生崩溃,一旦另一个进程尝试访问日志文件,日志文件可能会被破坏。 正在写入日志时,MinimalLock仅获取写入锁定。 这允许多个进程交叉写入同一文件,尽管性能有相当大的损失。 InterProcessLock根本不会锁定文件,而是使用全系统互斥锁进行同步。这只有在所有进程合作(并使用相同的锁定模型)的情况下才有效。为写入每个日志条目而获取和释放互斥锁将导致性能下降,但互斥体优于使用MinimalLock。 如果使用RollingFileAppender,情况会变得更糟,因为多个进程可能会尝试同时开始滚动日志文件。RollingFileAppender在滚动文件时完全忽略锁定模型,滚动文件与此场景根本不兼容。 更好的选择是让你的进程登录到RemotingAppenders。使用RemoteLoggingServerPlugin(或IRemoteLoggingSink),进程可以接收所有事件并将它们记录到单个日志文件中。其中一个示例显示如何使用RemoteLoggingServerPlugin。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100008230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档