当使用Visual Studio进行开发和调试时,我们会在VS输出窗口中获得以下log4net错误消息:
log4net:ERROR [RollingFileAppender] Unable to acquire lock on file C:\folder\file.log.
该进程无法访问文件'C:\ folder \ file.log',因为它正在被另一个进程使用:
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.
配置部分应该如下所示:
<section
name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
我们的log4net配置部分如下所示:
<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]
"/>
<footer value="[Footer]
"/>
<conversionPattern value="%date %-5level %logger ${COMPUTERNAME} %property{UserHostAddress} [%property{SessionID}] - %message%newline"/>
</layout>
</appender>
<root>
<level value="INFO"/>
<appender-ref ref="RollingLogFileAppender"/>
</root>
</log4net>
发布于 2018-04-23 15:31:56
你可以尝试这样来添加:
<lockingModel type =“log4net.Appender.FileAppender + MinimalLock”/>
到你的<appender />
元素。这对性能有一定的影响,因为这意味着log4net会锁定文件,写入文件并为每个写入操作解锁。
默认行为的一个含义是,如果您在同一台计算机上运行的多个工作进程下正在执行的Web站点下使用它,则每个人都将尝试无限期地获取并保持该锁,其中两个是只会失去。将锁定模型更改为最小锁定可解决此问题。
发布于 2018-04-23 16:43:36
你需要注意log4net FAQ:
我如何获得多个进程登录到同一个文件? 在开始尝试提供任何替代方案之前,问问自己是否真的需要让多个进程登录到同一个文件,然后不要这样做;-)。 FileAppender为这个用例提供可插入的锁定模型,但所有现有的实现都有问题和缺点。 默认情况下,FileAppender在日志记录过程中对日志文件保持独占写入锁定。这可以防止其他进程写入文件。这种模式已知可以在Linux上(至少在某些版本的)Mono上发生崩溃,一旦另一个进程尝试访问日志文件,日志文件可能会被破坏。 正在写入日志时,MinimalLock仅获取写入锁定。 这允许多个进程交叉写入同一文件,尽管性能有相当大的损失。 InterProcessLock根本不会锁定文件,而是使用全系统互斥锁进行同步。这只有在所有进程合作(并使用相同的锁定模型)的情况下才有效。为写入每个日志条目而获取和释放互斥锁将导致性能下降,但互斥体优于使用MinimalLock。 如果使用RollingFileAppender,情况会变得更糟,因为多个进程可能会尝试同时开始滚动日志文件。RollingFileAppender在滚动文件时完全忽略锁定模型,滚动文件与此场景根本不兼容。 更好的选择是让你的进程登录到RemotingAppenders。使用RemoteLoggingServerPlugin(或IRemoteLoggingSink),进程可以接收所有事件并将它们记录到单个日志文件中。其中一个示例显示如何使用RemoteLoggingServerPlugin。
https://stackoverflow.com/questions/-100008230
复制相似问题