C# 同一应用服务器的多个实例导致2个问题
我有两个asp.net应用程序的服务器实例。当我们移动到集群时,我看到我的一些日志(滚动)文件只有2-3kb,而不是15mb。当我的应用程序在一台服务器上时,它工作得非常好。这是我对log4net的配置: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_
<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
或者您可以改为登录到数据库。多个应用程序写入同一个日志文件可能不是一个好主意。为什么不使用单独的日志文件呢?原因是我们的应用程序中有一个日志查看器。如果日志在单独的计算机上,则日志查看器不正确。