12

几年来,我一直在一些高流量网站上使用 Log4Net,我不能说我是一个满意的客户。所以,想看看其他人是否有同样的担忧:

  1. RollingFileAppendor 的 CPU 开销是巨大的。我的一些网站每天需要跟踪 5-10GB,当我启用日志记录时,CPU 利用率会增加一倍以上。我想避免讨论为什么需要如此多的追踪。一些关键任务应用程序必须跟踪每笔交易的每一步。

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

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

因此,我正在考虑放弃 Log4Net 以支持 Microsoft Enterprise Library 或其他东西。这里有人和我有同样的问题吗?

4

6 回答 6

3
  1. 是的,它往往会使用过多的 CPU。我有一个应用程序,我每天记录 ~15GB,CPU 使用率有点高。我将日志记录减少到约 4GB/天,现在 CPU 使用率根本不明显。
  2. 我从未见过这种行为(自 1.1.1(3 年)以来,我一直在高流量网站中使用 log4net)
  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>
于 2009-06-11T14:38:54.483 回答
2

可能不是您的情况,但我认为对于如此大量的日志数据,您应该使用日志管理系统,该系统在运行时对您的实际应用程序的影响为零或最小。除非您的应用程序所做的只是创建日志,否则滚动和管理千兆字节的日志是相当尴尬的。另一点——我听到了许多来自 entlib 日志记录用户的抱怨,特别是关于性能的抱怨。在切换到它之前,我会检查它如何处理您的大量数据。但即使你确实发现它比 log4net 更好,我认为你仍然会自己管理巨大的日志文件。

于 2009-06-11T16:34:20.430 回答
2

您可以查看使用ASP.NET 2.0 的 Health MonitoringHow To: Use Health Monitoring in ASP.NET 2.0

但我认为你会遇到类似的问题。您正在尝试将日志记录工具用作审计工具,而不是它的设计目的。

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

于 2009-06-11T14:35:23.073 回答
1

到目前为止,我倾向于将一切归咎于基于日期的滚动功能。我已经尝试在几台服务器上将它换成基于大小的滚动,并且我不再看到任何数据丢失。当然,这不是一个很好的解决方法,因为我不再每天有一个跟踪文件。此外,基于大小的滚动似乎有一个错误,导致文件滚动得太早或太晚。但这并不像原来的问题那么痛苦......

于 2009-06-15T15:11:28.797 回答
0

对于性能问题,log4net 的优点在于您始终可以对其进行分析,以查看您的应用程序使用 log4net 的瓶颈所在,或者:1)自己解决解决方案,或者 2)找到一个没有瓶颈的日志框架。

在不了解您的应用程序的情况下,我无法提供太多帮助,但粗略地看了一下 log4net 源代码,我注意到该NextCheckDate()函数在 EVERY 上被调用 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

于 2011-03-23T08:27:45.417 回答
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 和日志轮换(包括循环)的高性能日志记录,请查看我最近在博客中提到的 EventSchemaTraceListener,但是用于查看日志(采用 XML 格式)的工具支持不是很好好的。

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

于 2013-04-21T07:22:34.813 回答