同一应用程序服务器的多个实例导致2个问题

时间:2017-03-10 11:56:33

标签: c# asp.net logging log4j log4net

我有一个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

2 个答案:

答案 0 :(得分:1)

您的问题是因为您从多个服务器(“value =”\ file_server \ MyLog.xml“)写入相同的日志文件。从几个角度来看,这将是坏消息。

  1. 当其中一个实例想要使用该文件时,该文件可能会被锁定,并且日志文件将不会更新。
  2. 您创建的每个日志都会产生网络流量,这是所有流量最慢的流量。如果您正在编写Async,那么您可能不会注意到这一点,但最好在本地编写日志,然后使用Splunk等日志阅读器工具对它们进行相关联。

答案 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。

或者您可以改为登录数据库。