我已经在几个高流量网站上使用Log4Net几年了,我不能说我是一个快乐的客户。所以,想看看是否有其他人有同样的担忧:
RollingFileAppendor的CPU开销很大。我的一些网站每天需要跟踪5-10GB,当我启用日志记录时,CPU利用率会增加一倍以上。我想避免讨论为什么需要如此多的追踪。一些关键任务应用程序必须跟踪每个事务的每一步。
按日期滚动通常是不可靠的(它在白天记录正常,但随后会在午夜左右弄乱最后一天的日志文件)。此行为不一致。我似乎不仅仅是网上的一些人抱怨这个,似乎没有人有一个好的解决方案。
最后但并非最不重要的是,我在过去三年中没有在Apache网站上看到任何新版本。因此,这开始看起来像一个废弃的开源项目,这通常意味着是时候转向一些替代框架了。
所以,我正在考虑放弃Log4Net,转而使用Microsoft Enterprise Library或其他东西。这里有人和我有同样的问题吗?
答案 0 :(得分:3)
这是我的appender配置供比较:
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender, log4net" >
<param name="File" value="log" />
<param name="AppendToFile" value="true" />
<rollingStyle value="Date" />
<datePattern value="yyyyMMdd" />
<maxSizeRollBackups value="7" />
<layout type="log4net.Layout.PatternLayout, log4net">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
</layout>
</appender>
答案 1 :(得分:2)
您可以查看使用ASP.NET 2.0's Health Monitoring和How To: Use Health Monitoring in ASP.NET 2.0
但我认为你会遇到类似的问题。您正在尝试使用日志记录工具作为审计工具,而不是它的设计目的。
“一些关键任务应用必须追踪每笔交易的每一步。” - 这是我将作为交易的一部分记录到数据库的信息。如果信息在交易之外运行,您如何保证信息是正确的?
答案 2 :(得分:2)
可能不是你的情况,但我认为对于这样大量的日志数据,您应该使用日志管理系统,该系统在运行时对您的实际应用程序的影响为零或最小。除非您的所有应用程序都创建日志,否则滚动和管理千兆字节的日志是相当尴尬的。另一点 - 我听到很多来自entlib伐木用户的投诉,特别是有关性能的问题。在切换到数据之前,我会检查它对你的数据量的影响。但即使你发现它比log4net更好,我想你仍然会自己管理大量的日志文件。
答案 3 :(得分:1)
到目前为止,我倾向于将所有内容归咎于基于日期的滚动功能。我已经尝试将它换成几台服务器上基于大小的滚动,我不再看到任何数据丢失。 当然,这不是一个很好的解决方法,因为我每天不再有一个跟踪文件。此外,基于大小的滚动似乎有一个错误,导致文件过早或太晚滚动。但这不像原来的问题那么痛苦......
答案 4 :(得分:0)
对于性能问题,log4net的优点在于您始终可以对其进行概要分析,以查看您的应用程序使用log4net的位置是瓶颈,并且: 1)自己处理解决方案或 2)找到没有该瓶颈的日志框架。
在不知道你的应用程序的情况下我不能帮助太多,但是从粗略看一眼log4net源代码我注意到NextCheckDate()
函数正在每个void Append(LoggingEvent loggingEvent)
上调用。我在下面列出了NextCheckDate的一部分源代码,我肯定会想到这会导致在高容量日志记录方案中出现性能问题。
protected DateTime NextCheckDate(DateTime currentDateTime, RollPoint rollPoint){
// Local variable to work on (this does not look very efficient)
DateTime current = currentDateTime;
// Do different things depending on what the type of roll point we are going for is
switch(rollPoint)
{
case RollPoint.TopOfMinute:
current = current.AddMilliseconds(-current.Millisecond);
current = current.AddSeconds(-current.Second);
current = current.AddMinutes(1);
break;
case RollPoint.TopOfDay:
current = current.AddMilliseconds(-current.Millisecond);
current = current.AddSeconds(-current.Second);
current = current.AddMinutes(-current.Minute);
current = current.AddHours(-current.Hour);
current = current.AddDays(1);
break;
case RollPoint.TopOfMonth:
current = current.AddMilliseconds(-current.Millisecond);
current = current.AddSeconds(-current.Second);
current = current.AddMinutes(-current.Minute);
current = current.AddHours(-current.Hour);
current = current.AddMonths(1);
break;
}
return current;}
您的应用程序的优化版本可能会提前缓存下一个翻转时间,并且只对每个Append
进行一次比较
答案 5 :(得分:0)
所以,我正在考虑放弃Log4Net,转而使用Microsoft Enterprise Library或其他东西。
有关您可能需要考虑的备用日志框架的比较,请参阅http://essentialdiagnostics.codeplex.com/wikipage?title=Comparison
它比较了.NET Framework System.Diagnostics(内置功能),log4net,NLog和Enterprise Library,包括性能比较。
每个都有优点和缺点,但EntLib在性能比较方面做得特别糟糕,而且在功能方面,有时候内置的.NET Framework System.Diagnostics少了。
如果您特别关注性能,那么log4net会与.NET Framework System.Diagnostics类似地获胜。
NLog在没有记录时(即只是将其留在代码中)的开销很小,比log4net或System.Diagnostics更快,但随着日志记录量的增加开始落后。
对于使用System.Diagnostics的高性能日志记录,使用日志轮换(包括循环),查看我最近blogged about的EventSchemaTraceListener,但查看日志的工具支持(在XML中)格式)不是很好。
如果您担心,我建议您进行一些性能测试。对于上面列出的比较,性能比较的源代码在Essential Diagnostics项目中可用,因此您可以自己运行它,但您可能希望根据您的情况进行定制。