Log4Net性能

Ben*_*zar 16 c# logging log4net multithreading

我编写了一个C#应用程序,它在循环中不断运行,并且有几个线程写入log4net文件.

问题是应用程序运行的时间越长,完成循环所需的时间就越长.我已经运行了一个ANTS性能分析器,并注意到大部分CPU时间花在使用log4.net进行日志记录.

日志越详细,它使用的CPU越多,30分钟后它使用100%的CPU.如果我禁用日志记录,循环所需的时间将随着时间的推移保持不变.我查看了Windows性能监视器,物理磁盘大部分时间都是IDLE.

我试图将我的日志记录保持在最低限度,但即使记录的数量相对较少,我仍然遇到问题.

以下是我的Log4net.xml配置文件的示例:

<log4net>
  <root>
    <!-- Levels: OFF, DEBUG, INFO, WARN, ERROR, FATAL-->
    <level value="INFO" />
    <appender-ref ref="RollingLogFileAppender" />
  </root>

  <!--Logs to a file-->
  <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="c:\\logs\\log-file.txt" />
    <appendToFile value="true" />
    <lockingModel type="log4net.Appender.FileAppender+ExclusiveLock" />
    <rollingStyle value="Composite" />
    <datePattern value="yyyyMMdd" />
    <maxSizeRollBackups value="20" />
    <maximumFileSize value="1MB" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger %L %M Schdl:[%property{scheduleContext}] Job:[%property{jobContext}] - %message%newline" />
    </layout>
  </appender>
</log4net>
Run Code Online (Sandbox Code Playgroud)

我正在使用记录的每个对象使用相同的记录器.

  log4net.ILog logger;
  log4net.Config.BasicConfigurator.Configure();
  logger = log4net.LogManager.GetLogger(typeof(myProject));
Run Code Online (Sandbox Code Playgroud)

为什么它运行得越久就会使用越来越多的CPU?

任何关于如何改善这一点的建议将不胜感激.

Pet*_*old 32

您是否在每个记录对象中配置log4net?它看起来就像你的代码.每个进程应该进行一次配置,例如在启动时,然后您的对象应该只需要获取记录器.

对于需要记录的每个类,我通常具有以下模式:

class SomeClass
{
    private static readonly ILog log = LogManager.GetLogger(typeof(SomeClass));
    ...
}
Run Code Online (Sandbox Code Playgroud)

使用此模式,您将根据类的名称空间和名称自动获取分层的记录器.

  • 删除额外的Configure()之后,我能够稳定地记录几个小时,我还能够记录更大量的文本,而不会遇到我遇到的性能问题.谢谢你的帮助. (7认同)