Log4net性能问题:修复了消息之间的延迟

本文关键字:消息 之间 延迟 性能 问题 Log4net | 更新日期: 2023-09-27 17:51:22

我有一个相当复杂的应用程序,由2个网站和3个windows服务组成。都使用相同的log4net配置,只是写入不同的文件:

<log4net>
  <logger name="Default">
    <appender-ref ref="VerboseLogFileAppendder" />
  </logger>
  <appender name="VerboseLogFileAppendder" type="log4net.Appender.RollingFileAppender">
    <threshold value="DEBUG" />
    <file value="Logs'MyProductName" />
    <appendToFile value="true" />
    <rollingStyle value="Date" />
    <maximumFileSize value="100MB" />
    <datePattern value="'.'yyyy-MM-dd'.log'" />
    <staticLogFileName value="false" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%-3thread] %-5level - %message%newline" />
    </layout>
  </appender>
</log4net>

但是一个站点在写日志时存在巨大的性能问题 - 每两个相邻的消息在它们之间或多或少有固定的延迟。例如,下面是我的日志文件的一部分:

2014-03-21 21:48:19,163 [24 ] INFO  -       Begin SiteColourTheme
2014-03-21 21:48:19,489 [24 ] INFO  -         IsChanged = False
2014-03-21 21:48:19,808 [24 ] INFO  -         GridHeaderColour.BackgroundColour = #373F71
2014-03-21 21:48:20,133 [24 ] INFO  -         GridHeaderColour.IsBackgroundColourChanged = False
2014-03-21 21:48:20,464 [24 ] INFO  -         GridHeaderColour.FontColour = #E0E0E0
2014-03-21 21:48:20,800 [24 ] INFO  -         GridHeaderColour.IsFontColourChanged = False
2014-03-21 21:48:21,134 [24 ] INFO  -         GridHeaderColour.IsColourThemeChanged = False
2014-03-21 21:48:21,475 [24 ] INFO  -         DialogHeaderColour.BackgroundColour = #373F71
2014-03-21 21:48:21,810 [24 ] INFO  -         DialogHeaderColour.IsBackgroundColourChanged = False
2014-03-21 21:48:22,139 [24 ] INFO  -         DialogHeaderColour.FontColour = #FFFFFF
2014-03-21 21:48:22,462 [24 ] INFO  -         DialogHeaderColour.IsFontColourChanged = False
2014-03-21 21:48:22,781 [24 ] INFO  -         DialogHeaderColour.IsColourThemeChanged = False
2014-03-21 21:48:23,122 [24 ] INFO  -         AccordionPaneColour.BackgroundColour = #F8F8F8
2014-03-21 21:48:23,481 [24 ] INFO  -         AccordionPaneColour.IsBackgroundColourChanged = False
2014-03-21 21:48:23,862 [24 ] INFO  -         AccordionPaneColour.FontColour = #2B2B2B
2014-03-21 21:48:24,202 [24 ] INFO  -         AccordionPaneColour.IsFontColourChanged = False
2014-03-21 21:48:24,522 [24 ] INFO  -         AccordionPaneColour.IsColourThemeChanged = False
2014-03-21 21:48:24,862 [24 ] INFO  -         PageTabColour.BackgroundColour = #DCDBDB
2014-03-21 21:48:25,208 [24 ] INFO  -         PageTabColour.IsBackgroundColourChanged = False
2014-03-21 21:48:25,527 [24 ] INFO  -         PageTabColour.FontColour = #000000
2014-03-21 21:48:25,855 [24 ] INFO  -         PageTabColour.IsFontColourChanged = False

可以看到,即使只是记录对象的属性,延迟也超过300ms(没有复杂的逻辑来检索它们)。我发现这个延迟与日志大小成正比:如果它是1mb,延迟大约是100ms, 2mb - 200ms, 3mb - 300ms。我想知道是什么导致了这样的问题。如有任何意见,我将不胜感激。

调查细节:

因为我们没有直接使用log4net,而是创建了一个包装器,我首先想到包装器中有一个bug,但它很简单,我不知道它如何导致如此奇怪的问题,只在一个站点。

VS 2013性能分析器令人惊讶地没有说日志记录器方法取了最多的样本(我使用抽样分析)。我认为这证明问题不是在逻辑上,而是在访问外部资源,而应用程序线程被挂起。

没有发现两个站点之间的任何差异,这些差异应该导致一个站点出现此问题而另一个站点出现此问题。这些站点当然非常不同,但没有可疑的环境或IIS配置差异。

我有一个的想法,日志文件打开和关闭每次写,但我不知道如何检查这一点。我可以在记事本中打开日志,在应用程序运行时编辑并保存它。也许这就是一个证明。但是,在这种情况下,延迟不应该几乎与文件大小固定(而不是成比例)吗?系统所需要的只是查找由文件大小定义的文件的末尾(如果文件是分区的,可能很少查找,但这并不重要)。如果这是问题所在,我该如何解决?我尝试使用缓冲日志追加器,但结果相同。

另一个的想法是防病毒检查文件在每次写,但禁用它并不能解决问题。

更新:

将日志文件夹从本地相对路径更改到其他目录"D:' logs…"解决了我的开发环境中的问题,但在测试机上不起作用。

更新2

问题正在不稳定地复制。有一天,我可能会遇到所描述的性能问题,但既不重启,也不更改日志配置;但有一天问题消失了,我以为我找到了解决办法。但是现在它又开始复制了,我不知道为什么会这样。

Log4net性能问题:修复了消息之间的延迟

诊断这类问题真的很难,因为可能有许多因素在起作用来解释这种差异。然而,您提到您有许多日志参与者。它们都在同一台机器上吗?你发布的配置文件是有问题的网站的配置文件吗?

这不是对您的问题的直接回答,但您也可以研究BufferingForwardAppender(示例),它会累积消息直到配置的限制。这不会直接解决问题,但会加重日志文件上的"写入税",并且它有一些有趣的属性(例如有损日志记录,但这不是主题:))