2009-06-11 141 views
11

我在几个高流量的网站上使用Log4Net已经有两年了,我不能说我是一个快乐的客户。所以,想看看其他人是否也有同样的担忧:Log4Net出了什么问题?

  1. RollingFileAppendor的CPU开销很大。我的一些网站每天需要跟踪5-10GB,并且在启用日志记录功能时,CPU利用率增加了一倍以上。我想避免讨论为什么需要这么多追踪。一些关键任务应用程序必须跟踪每个事务的每一步。

  2. 按日期滚动通常是不可靠的(它在白天记录正常,但是在午夜左右会弄糟最后一天的日志文件)。这种行为是不一致的。我似乎在网上有很多人抱怨这一点,没有人似乎有一个很好的解决方案。

  3. 最后但并非最不重要的是,在过去的三年中,我还没有在Apache网站上看到任何新版本。因此,这开始看起来像是一个被遗弃的开源项目,这通常意味着是时候转向一些替代框架。

因此,我正在考虑放弃Log4Net,转而使用Microsoft企业库或其他方法。这里有没有人和我有同样的问题?

+4

任何需要每天记录5-10GB的网站(除IIS日志外)在我看来都有一个设计缺陷。 Log4Net并非设计成审计员 – 2009-06-11 14:28:56

+0

关于文件在一天结束时滚动的有趣提示。它在Windows 7(IIS 7.5)上运行良好,但是当我们切换到Win 2008 Server(也是IIS 7.5)时,我们开始看到大量数据被破坏。昨天的10MB日志文件被替换为几个日志行。任何想法为什么? – Sire 2010-11-10 14:38:04

回答

2

你可以看看使用ASP.NET 2.0's Health Monitoring,并How To: Use Health Monitoring in ASP.NET 2.0

但我认为你将不得不similiar问题。您正在尝试使用日志记录工具作为审计工具,而不是其设计的目的。

“一些关键任务应用程序必须跟踪每笔交易的每一步。” - 这是我将作为事务的一部分登录到数据库的信息。如果它在交易之外运行,您如何保证信息是正确的?

+0

Mitch, 我同意我的一些需求是围绕审计。但是,我们偶尔也必须对难以在我们的测试环境中重现的棘手的并发或数据问题进行本地化。因此,我们不得不暂时在Production上启用调试级别跟踪并创建大量的卷。 PS:谈论审计 - 你能否推荐一个真正能够扩展的框架? – 2009-06-11 15:31:10

3
  1. 是的,它倾向于使用太多的CPU。我有一个应用程序,我登录〜15GB /天,CPU使用率很高。我将日志减少到〜4GB/day,现在CPU使用率根本不明显。
  2. 我从来没有见过这种行为(我一直在使用log4net自1.1.1(3年)在高流量的网站)
  3. 是的,它有点安静,但也许这是因为它是一个稳定,成熟的项目。而且开发并没有完全停止,你可以在svn repo看到最近有一些提交。如果你担心这个问题,看看NLog,这是一个更年轻,更活跃的项目。

这里是我的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> 
+0

mausch, 感谢您的详细解答!我很高兴看到Log4Net对你来说非常有用。你能分享你如何配置Log4Net RollingFileAppender以及你是否使用缓冲appender? – 2009-06-11 15:04:54

+0

这是我的行为不当的配置文件: 2009-06-11 15:06:08

2

可能这不是你的情况,但我认为,随着日志数据,例如卷,你应该使用它具有零或影响最小日志管理系统在您的实际应用程序运行时。除非您的应用程序确实是创建日志,否则滚动和管理千兆字节的日志会相当尴尬。还有一点 - 我听到很多用户对entlib日志的投诉,特别是关于性能的问题。在切换到它之前,我会检查它对数据量的影响。但即使你发现它比log4net好,我认为你仍然会自己管理巨大的日志文件。

1

到目前为止,我倾向于责怪所有基于日期的滚动功能。我试过将它换成在几台服务器上进行基于大小的滚动,我不再看到任何数据丢失。 当然,这不是一个漂亮的解决方法,因为我每天不再有一个跟踪文件。此外,基于大小的滚动似乎有一个错误,导致文件滚动太早或太迟。但这并不像原始问题那么痛苦......

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

0

所以比较单一的优化版本,我正在考虑赞成微软放弃log4net的企业库或其他东西。

对于你可能要考虑替代日志框架进行比较,看http://essentialdiagnostics.codeplex.com/wikipage?title=Comparison

它比较的.NET Framework System.Diagnostics程序(内置功能),log4net的,NLOG和企业库,其中包括性能比较。

每个人都有优缺点,但EntLib在性能比较方面表现特别差,而且就功能而言,有时候内建.NET Framework System.Diagnostics的功能更少。

如果您特别关注性能,那么log4net会略微赢得.NET框架System.Diagnostics类似。

NLog在不记录日志时(即将其留在代码中)的开销非常小,比log4net或System.Diagnostics快,但随着记录日志卷的增加开始落后。

对于使用System.Diagnostics进行高性能日志记录以及日志轮转(包括循环),请查看EventSchemaTraceListener,我最近在blogged about,但查看日志(它们是XML格式)的工具支持isn很不错。

如果您担心,我建议您设置一些性能测试。对于上面列出的比较,性能比较的源代码在Essential Diagnostics项目中可用,因此您可以自己运行它,但您可能需要根据自己的情况进行调整。