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

C# 同一应用服务器的多个实例导致2个问题,c#,asp.net,logging,log4j,log4net,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_

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

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

  • 当其中一个实例想要使用该文件时,该文件可能会被锁定,并且日志文件不会得到更新
  • 您创建的每个日志都会生成网络流量,这是所有流量中速度最慢的。如果您正在编写异步日志,则可能不会注意到这一点,但最好在本地编写日志,然后使用日志读取器工具(如Splunk)将其关联起来

  • 评论太长了

    委员会:

    在您开始尝试提供的任何备选方案之前,问问自己是否真的需要将多个进程记录到同一个文件中,然后不要这样做;-)。

    FileAppender为此用例提供了可插拔锁定模型,但所有现有实现都存在问题和缺点

    默认情况下,FileAppender在日志记录时会对日志文件持有独占写入锁定。这会阻止其他进程写入该文件。众所周知,Linux上的Mono(至少在某些版本上)会导致此模型崩溃,一旦其他进程尝试访问日志文件,日志文件可能会损坏

    MinimalLock仅在写入日志时获取写锁。这允许多个进程交错写入同一文件,但会造成相当大的性能损失

    InterProcessLock根本不锁定文件,而是使用系统范围的互斥锁进行同步。这只有在所有进程协作(并使用相同的锁定模型)时才起作用。为每个要写入的日志条目获取和释放互斥锁将导致性能损失,但互斥锁比使用MinimalLock更可取

    如果使用RollingFileAppender,情况会变得更糟,因为多个进程可能会尝试同时开始滚动日志文件。滚动文件时,RollingFileAppender完全忽略锁定模型,滚动文件与此场景不兼容。

    更好的选择是让您的进程记录到RemotingAppenders。使用RemoteLoggingServerPlugin(或IRemoteLoggingSink),进程可以接收所有事件并将其记录到单个日志文件。其中一个示例演示了如何使用RemoteLoggingServerPlugin


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

    多个应用程序写入同一个日志文件可能不是一个好主意。为什么不使用单独的日志文件呢?原因是我们的应用程序中有一个日志查看器。如果日志在单独的计算机上,则日志查看器不正确。