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)
使用此模式,您将根据类的名称空间和名称自动获取分层的记录器.