log4net与Nlog的比较

355

有没有人对两个技术都有经验?它们彼此之间如何比较?

我们计划在企业应用程序中使用其中之一进行日志记录。

参考:

log4net

nlog

编辑:我们目前不依赖nlog或log4net。


9
这是我使用的记录器:System.IO.File.AppendAllText(@"c:\log.txt", string.Format("{0}\r\n", message)); - zumalifeguard
213
对你来说很好,但有些人可能需要动态开启/关闭日志记录、使用不同的日志级别、自动删除旧的日志数据等功能。 - Tor Hovland
23
需要注意的是,Log4Net 的文档非常糟糕。 - BentOnCoding
2
你应该试试ReflectInsight。比http://insightextensions.codeplex.com/更强大。 - code5
@code5 ReflectInsight查看器是商业软件(2014年3月之前免费,2013年7月1日后售价为299美元)。 - yzorg
15个回答

383

我最近被要求为即将开展的项目“原型化一些日志记录”。我之前没有任何日志框架的经验。于是我花了几天时间研究、运行教程、制作玩具应用等,学习了Log4Net、NLog和Enterprise Library。3-4周后回来,把它们结合起来做成一个连贯的演示。希望这对你们有所帮助。

我对我们项目的建议如下:

  1. 使用一个日志门面(例如Common.LoggingSimpleLoggingFacade)以避免直接依赖。
  2. 如果我们最终使用Enterprise Library进行其它设施,则也要使用它进行日志记录。
  3. 如果我们使用了依赖于Log4Net的内容,则使用Log4Net。
  4. 如果以上都不适用,则使用NLog。这是我更喜欢的。

这些建议基于以下发现(仅代表个人观点!):

  • 所有三个框架都很强大,可以做出一些复杂的事情。我们需要一个高质量的解决方案,但实际上不需要超高性能或60种事件接收器。
  • 所有三个框架都有非常相似的基本概念。
  • 每个框架都有自己的独特技巧,比如高级路由、动态日志文件名、文件截断等。
  • 所有三个框架都有很好的文档记录方式。
  • 对于像我这样的完全新手来说,它们最初都有点别扭。但基础知识没有太大区别,我克服了这一点。
  • 几周后重新审视时,NLog 显然是最容易继续使用的。我只需要很少的复习就能上手。使用 Log4Net 需要重新查看一些在线示例才能开始。对于 EntLib,我放弃并从头开始重新做教程——我完全迷失了方向。
  • 我无法弄清楚如何让 EntLib 做一些像日志记录到数据库这样的事情。也许很简单,但已超出我的时间限制。
  • Log4Net和NLog在代码中占用很小的空间。EntLib很烦人,但我会使用其外观。
  • 我不小心配置错误了EntLib,它在运行时告诉了我。Log4Net没有。我没有在NLog上出现意外的配置问题。
  • EntLib带有一个漂亮的app.config编辑器,你百分之百需要。NLog有一个配置文件模式,所以你可以得到“intellisense”。Log4Net什么都没带。
  • 显然,我到目前为止很喜欢NLog。但并不足以在有其他解决方案的情况下使用它。


    19
    建议建立门面模式以实现真正的责任分离(SoC),或者避免污染你的领域,+1。 - eduncan911
    66
    只有在不破坏依赖于调用栈等诊断值的情况下,外观模式才能发挥作用。我见过很多破坏这些关键诊断功能的外观模式,结果弊大于利... - James Schek
    11
    Log4Net目前还不支持.NET 3.5 SP1和.NET 4的客户端配置,因为它引用了System.Web。虽然这实际上与“有一个对Log4Net的依赖关系,使用Log4Net”密切相关,但我只是想指出这一点。 - Simon D.
    59
    NLog目前得到积极支持(http://nlog-project.org/download),而Log4Net自2006年4月19日发布版本1.2.10以来一直没有更新(https://issues.apache.org/jira/browse/LOG4NET/fixforversion/11128)。 - Jay Cincotta
    5
    如果你的项目依赖于使用log4net的库,但希望改用NLog(或反之),编写和配置一个自定义的Appender类以桥接两者是相当简单的。 - dbkk
    显示剩余8条评论

    158

    30
    需要更新吗?如果没有出现故障,就不要修理它吗? - glenneroo
    24
    它确实存在问题:
    • 在Vista和Win7上,IPv4/IPv6的本地主机ip地址解析受到干扰(有几个非官方修补程序在流传)
    • 无法在.Net 4.0客户端配置文件中编译。
    - Tormod Hystad
    6
    似乎正在制作Log4Net的.NET 4.0版本。 - scope_creep
    38
    log4net已于2011年10月发布了v1.2.11。我认为这个答案现在已经过时了。 - Mariano Desanze
    83
    实际上,这个回答对我仍然有价值。我正在选择一个日志记录器,在这个回答中,我们得知log4net在过去的五年里只更新了一次,而NLog是一个更为活跃的项目。 - John Reynolds
    显示剩余7条评论

    97

    最近我使用过这两个框架,我想分享一下我的看法。

    我被要求评估一个现有Web应用程序的日志框架,在浏览了各种在线论坛后,我将选择范围缩小到NLog(v2.0)和log4net(v1.2.11)。以下是我的发现:

    1. NLog的设置/启动非常简单。您可以在他们的网站上通过“入门教程”完成设置工作。你可以得到一个很好的想法,nlog如何工作。配置文件非常直观,任何人都能理解它。例如:如果您想启用内部日志记录,则在Nlog配置文件的头节点中设置标志,这是您期望它的位置。在log4net中,您需要在web.config的appSettings节中设置不同的标志。

    2. 在log4net中,内部日志记录不输出时间戳,这很让人恼火。在Nlog中,您可以获得带有时间戳的良好日志。我在我的评估中发现它非常有用。

    3. log4net的过滤器 - 您最好查看我的这个问题 - log4net filter - how to write AND filter to ignore log messages 如果您找到答案/解决方案,请让我知道。我知道,有一种解决方法是编写自己的自定义过滤器。但这在log4net中不易得到。

    4. 性能 - 我使用存储过程将约3000条日志消息记录到数据库中。我使用简单的for循环(int i = 0; i < 3000; i ++...)来记录相同的消息3000次。对于写入操作:log4net AdoAppender所需的时间几乎是NLog的两倍。

    5. Log4net不支持异步appender。

    这对我来说已经足够比较了,我选择了NLog作为我的日志框架。


    log4net的内部调试日志:http://logging.apache.org/log4net/release/sdk/log4net.Util.LogLog.InternalDebugging.html - Narayan Akhade

    36

    对于那些较晚关注本主题的人,您可能需要回顾一下.Net基类库(BCL)。2005年左右,.Net 1.1和.Net 2.0之间引入了TraceSource类,许多人错过了这些更改。

    使用TraceSource类类似于其他日志记录框架,具有粒度控制日志记录、在app.config/web.config中配置以及编程访问的功能,而不需要企业应用程序块的开销。

    还有许多比较:“log4net vs TraceSource”


    1
    EntLib正在扩展TraceSource。 - Michael Freidgeim

    34

    对我们来说,关键区别在于整体性能方面。如果您需要低延迟的解决方案,那么根据我们的测试,在 NLog 中查看 Logger.IsDebugEnabled 与 Log4Net 的比较,NLog 的开销要小得多。

    祝好, 弗洛里安


    25

    首先看看你的堆栈中剩下的部分。

    如果你正在使用NHibernate,它直接利用Log4Net。 其他框架可能需要其他特定的日志记录器。

    除此之外,两者都可以很好地工作。

    我自己选择了Log4Net。配置起来可能有些麻烦,如果配置不正确,找出问题会比较麻烦。但是你可以让它做几乎所有你想要的记录器功能。

    如果你还没有使用Log4Net的问题,这里有一篇文章介绍如何入门: http://elegantcode.com/2007/12/07/getting-started-with-log4net/


    9
    请注意,NHibernate v3已经移除了对log4net的依赖,现在它是可插拔的,如果您愿意,可以使用NLog。 - UpTheCreek
    NLog 的配置和故障排查同样令人头疼。至少使用 log4net,你可以找到文档或者通过谷歌解决问题。 - Mrchief
    考虑到您的整个堆栈,这是一个很好的观点,我不能说这是我一开始会考虑到的问题。虽然看起来NHibernate不再是此场景的示例,但Sitecore提供了一个现代化的示例,因为它在内部使用Log4Net。Sitecore非常可扩展,因此您可以使用任何您喜欢的日志记录器,但这比编辑站点的web.config以添加自己的记录器要复杂得多。 - Scott Simontis

    16

    14

    我同意上面的观点,并且更喜欢nLog。Entlib是过度臃肿的。

    关于Log4net,有一件事情总是让我困扰,就是忘记在global.asax中添加以下内容来初始化组件:

    log4net.Config.XmlConfigurator.Configure();
    

    13

    如果您访问此处,您可以找到一个全面的矩阵,包括NLog和Log4Net库以及企业库和其他产品。

    有人可能会认为该矩阵是以强调矩阵中唯一商业库的功能为目的而制作的。我认为这是真的,但它仍然对我选择NLog很有帮助。

    敬礼


    1
    看那个矩阵,它似乎至少在商业竞争对手The Object Guy的框架方面已经过时了。 - Andy Dent

    9

    我运营一个开源项目,名为Serilog。虽然大家在讨论.NET日志记录框架哪个更活跃,但我还是想必要地放一下链接: Serilog

    Serilog类似于log4net,可以在应用程序中使用,并且在很大程度上基于它。不过,与其他.NET日志记录选项不同,Serilog旨在保留日志事件的结构以供脱机分析。当您编写以下内容时:

    Log.Information("The answer is {Answer}", 42);
    

    大多数日志记录库立即将消息呈现为字符串。Serilog也可以这样做,但它保留了{ Answer: 42 }属性,以便稍后使用多个NoSQL数据存储之一,您可以基于Answer的值正确查询事件。

    我们快要推出1.0版本,并支持所有现代(.NET 4.5、Windows Store和Windows Phone 8)平台。


    但问题是:它支持Mono吗? ;) 它看起来很有前途(我喜欢线和针的标志),但找不到任何关于它是否支持Mono的信息。 - ashokgelal
    不错的问题 :) ... 是的,我们的Mono上有用户 - 我不确定他们是否使用Serilog的.NET 4.5版本或4.0版本,但如果您遇到任何问题,我们会提供帮助。 - Nicholas Blumhardt
    .NET 4.5 的支持让我很感兴趣,我现在正在下载并尝试您的解决方案。 - Fat Shogun

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接