我有一个asp.net应用程序的两个服务器实例。当我们移动到集群时,我看到我的一些日志(滚动)文件只有2-3kb而不是15mb。当我的应用程序在一台服务器上时,这非常有效。这是我对log4net的配置:
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString" value="\\file_server\\MyLog.xml"/>
<appendToFile value="true"/>
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
<datePattern value="ddMMyyyy"/>
<rollingStyle value="Size"/>
<maxSizeRollBackups value="14"/>
<maximumFileSize value="15360KB"/>
<staticLogFileName value="true"/>
<countDirection value="1"/>
<layout type="log4net.Layout.XmlLayoutSchemaLog4j">
<locationInfo value="true"/>
</layout>
</appender>
我不确定这是一个错误还是别的什么。另外,我在这里发现了一些与此相关的问题,但没有解决方案:https://issues.apache.org/jira/browse/LOG4J2-174
答案 0 :(得分:1)
您的问题是因为您从多个服务器(“value =”\ file_server \ MyLog.xml“)写入相同的日志文件。从几个角度来看,这将是坏消息。
答案 1 :(得分:1)
评论太长了。
log4net documentation is very clear on this:
在您开始尝试提供的任何替代方案之前,先问问自己是否确实需要将多个进程记录到同一个文件中,然后不要这样做; - )。 < / p>
FileAppender为此用例提供可插入锁定模型,但所有现有实现都存在问题和缺点。
默认情况下,FileAppender在日志记录时对日志文件保持独占写锁定。这可以防止其他进程写入该文件。众所周知,这个模型在Linux上与(至少在某些版本的)Mono上分解,一旦另一个进程尝试访问日志文件,日志文件就会被破坏。
MinimalLock仅在写入日志时获取写锁定。这允许多个进程将写入交错到同一文件,尽管性能会相当大。
InterProcessLock根本不锁定文件,而是使用系统范围的互斥锁进行同步。这仅在所有进程协作(并使用相同的锁定模型)时才有效。为每个要写入的日志条目获取和释放Mutex将导致性能下降,但Mutex优于使用MinimalLock。
如果你使用RollingFileAppender,事情变得更糟,因为有几个进程可能会尝试同时开始滚动日志文件。 RollingFileAppender在滚动文件时完全忽略锁定模型,滚动文件与此方案完全不兼容。
更好的选择是让您的进程登录到RemotingAppenders。使用RemoteLoggingServerPlugin(或IRemoteLoggingSink),进程可以接收所有事件并将它们记录到单个日志文件中。其中一个示例显示了如何使用RemoteLoggingServerPlugin。
或者您可以改为登录数据库。