log4net与Nlog


355

任何人都有经验吗?他们如何相互对抗?

我们正计划使用其中之一来登录企业应用程序。

参考文献:

log4net

日志

编辑:我们没有现有的依赖关系到nlog或log4net。


9
这是我使用的记录器:System.IO.File.AppendAllText(@“ c:\ log.txt”,string.Format(“ {0} \ r \ n”,message));
zumalifeguard

213
好样的,但有些人可能需要打开/关闭日志动态,使用不同的日志级别,自动删除旧的日志数据等的能力
托尔·霍夫兰

23
应当指出,Log4Net文档非常糟糕。
BentOnCoding


2
您应该尝试ReflectInsight。然后,功能更加强大,
低于

Answers:


383

我最近受命为即将到来的项目“原型化一些登录”。我没有任何日志记录框架的经验。我在Log4Net,NLog和Enterprise Library上研究,浏览了教程,制作了玩具应用程序,等等。3-4周后回来,将它们放在一起进行演示。希望其中一些对您有用。

我对我们的项目的建议是:

  1. 使用日志外观(例如Common.LoggingSimpleLoggingFacade)避免直接依赖。
  2. 如果最终将Enterprise Library用于其他功能,则也将其用于日志记录。
  3. 如果最终使用的东西依赖Log4Net,请使用Log4Net。
  4. 如果以上都不是,请使用NLog。我更喜欢。

这是基于以下发现(观点!):

  • 所有这三个框架都有能力并且可以做一些复杂的事情。我们想要一个高质量的解决方案,但是坦率地说,不需要超高性能或60种类型的事件接收器。
  • 所有这三个都有非常相似的基本概念。
  • 每个都有自己的很酷的技巧,例如真正的高级路由,动态日志文件名,文件截断等。
  • 所有3个文件都以自己的方式很好地记录在案。
  • 对于像我这样的完整新手,他们一开始有点尴尬。这里的基础知识没有太大的差异。我克服了
  • 几周后重新访问时,NLog 显然是最容易恢复的。我只需要很少的化妆。使用Log4Net,我不得不重新回顾一些在线示例才能开始。有了EntLib,我放弃了,并从头开始重新制作了这些教程-我完全迷失了。
  • 我不知道如何让EntLib做一些事情,例如登录数据库。这可能很容易,但是超出了我的时间限制。
  • Log4Net和NLog的代码占用量很小。EntLib垃圾邮件,但无论如何我都会在其上使用外墙。
  • 我不小心配置了EntLib,它在运行时告诉我。Log4Net没有。我没有使用NLog意外配置错误。
  • EntLib带有一个漂亮的app.config编辑器,您100%需要它。NLog具有配置文件架构,因此您会获得“ intellisense”。Log4Net随附nada。

显然,到目前为止,我喜欢NLog。尽管有其他解决方案,但仍不足以使用它。


19
+1建议建立真正的关注点分离(SoC)外观,否则您不会污染您的域。
eduncan911 2010年

66
只有在不破坏依赖于调用堆栈等的诊断值的情况下,外观才能起作用。我已经看到很多外观破坏了这些基本的诊断功能,最终造成了更大的伤害……
詹姆斯Schek 2010年

11
Log4Net尚不支持.NET 3.5 SP1和.NET 4的客户端配置文件,因为它引用了System.Web。只是想指出一点,尽管它实际上与“依赖Log4Net,请使用Log4Net”密切相关。
Simon D.

59
NLOG积极支持(nlog-project.org/download而log4net的自1.2.10版本发布2006年出版(4月19日,一直没有更新)issues.apache.org/jira/browse/LOG4NET/fixforversion/11128
杰伊·辛科塔(Jay Cincotta)2010年

5
如果您对使用log4net的库有依赖关系,并且想改用NLog(反之亦然),那么编写和配置一个自定义的Appender类以将两者联系起来就非常简单。
dbkk 2011年

158

尚未讨论的关键考虑因素是支持和更新。

自2006年4月19日发布1.2.10版以来,Log4Net尚未更新。

相比之下,自2006年以来一直积极支持NLog,因为它将很快发布NLog 2.0,它支持上次更新log4net时不存在的许多平台,例如:

  • NET Framework 2.0 SP1及更高版本,3.5和4.0(客户端和扩展配置文件)
  • Silverlight 2.0、3.0、4.0
  • .NET Compact Framework 2.0、3.5
  • Mono 2.x配置文件

30
但是需要更新吗?如果还没有坏,就不要修理吗?
glenneroo 2010年

24
破坏了:*在Vista和Win7上为本地主机的IPv4 / IPv6之间的IP地址解析(多个非官方补丁正在浮动)*未在.Net 4.0客户端配置文件中编译
Tormod Hystad 2011年

6
Log4Net的作品中似乎有一个.NET 4.0版本。
scope_creep 2011年

38
log4net已于2011年10月启动v1.2.11。我认为这个答案已经过时了。
马里亚诺·德桑兹

83
实际上,这个答案对我来说仍然很有价值。我正在选择一个记录器,这个答案告诉我们在过去的五年中log4net已更新一次,而NLog是一个更活跃的项目。
Batibix 2011年

97

最近在这两个框架上都有经验,我认为我可以就每个框架分享自己的观点。

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

  1. 使用NLog进行设置/启动非常简单。您在他们的网站上浏览了“入门指南”,然后就完成了。您有一个不错的主意,nlog会是什么样子。配置文件非常直观,任何人都可以理解配置。例如:如果要设置内部登录,请在Nlog配置文件的头节点中设置该标志,这是您期望的位置。在log4net中,您可以在web.config的appSettings部分中设置不同的标志。

  2. 在log4net中,内部日志记录不会输出令人讨厌的时间戳。在Nlog中,您会获得带有时间戳的漂亮日志。我发现它对我的评估非常有用。

  3. log4net中的过滤器-您最好检查一下我的问题-log4net过滤器-如何编写AND过滤器以忽略日志消息,如果您找到答案或解决方案,请告诉我。我了解,此问题有解决方法,因为您可以编写自己的自定义过滤器。但是有些东西在log4net中不容易获得。

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

  5. Log4net不支持异步附加程序。

选择NLog作为日志记录框架对我来说已经足够了。:)



36

对于迟到使用此线程的任何人,您可能需要回顾一下.Net基类库(BCL)。TraceSource时,许多人都错过了.Net 1.1和.Net 2.0之间的更改引入类时(大约在2005年),。

使用TraceSource与其他日志记录框架类似,具有对日志记录的精细控制,app.config / web.config中的配置以及编程访问-无需增加企业应用程序块的开销。

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


1
EntLib正在扩展TraceSource
Michael Freidgeim'Feb

34

对我们而言,关键区别在于总体性能...

看一下Logger.IsDebugEnabledNLog与Log4Net,从我们的测试来看,NLog的开销较小,这就是我们所追求的(低延迟的东西)。

干杯,弗洛里安


25

首先看一下堆栈的其余部分。

如果您使用的是NHibernate,它将直接利用Log4Net。其他框架可能需要其他特定的记录器。

除此之外:两者都能正常工作。

我本人已经决定使用Log4Net。配置可能会很痛苦,如果配置不正确,那么就会弄清楚出了什么问题。但是您可以使其几乎完成记录器想要的任何事情。

如果您没有Log4Net的长期问题,这是我写的关于如何开始使用它的文章:http : //elegantcode.com/2007/12/07/getting-started-with-log4net/


9
@greg:请注意,在NHibernate v3中,对log4net的依赖已被删除-它是可插入的,因此您可以根据需要使用NLog。
2011年

同样,NLog也很麻烦来配置/找出问题所在。至少使用log4net,您可以找到说明文件或Google来查找问题。
彻奇

考虑到您的其余堆栈的好处,我不能说这是我本应考虑的问题。尽管看起来NHibernate不再是这种情况的示例,但是Sitecore提供了一个现代的示例,因为它在内部使用Log4Net。Sitecore具有相当的可扩展性,因此您可以使用任何您喜欢的日志记录,但是比编辑站点的web.config添加自己的记录器要复杂得多
Scott Simontis 2015年


14

我回应以上内容,并且确实更喜欢nLog。Entlib不必要地肿。

Re:Log4net总是使我受益于log4net的一件事就是忘记将以下内容添加到global.asax中以初始化组件:

log4net.Config.XmlConfigurator.Configure();

13

如果你去这里您会发现一个全面的矩阵,其中包括NLog和Log4Net库以及Enterprise Lib和其他产品。

有人可能会争辩说,矩阵是通过强调矩阵中唯一的商业库的特征来完成的。我认为这是对的,但无论如何还是要推动我与NLog的选择,它还是很有用的。

问候


1
从这个矩阵来看,至少与商业竞争者The Object Guy的框架相比似乎已经过时了。
安迪·邓特

9

正如我注意到的那样,log4net在整个应用程序运行期间会锁定它们的输出文件,因此您无法删除它们。否则它们是相似的。

所以我更喜欢NLog。


22
将<lockingModel type =“ log4net.Appender.FileAppender + MinimalLock” />添加到您的fileappender配置中以防止这种情况(在log4net示例页面上提到:logging.apache.org/log4net/release/config-examples.html
EventHorizo​​n

9

我为一个开源项目运行的无耻插件,但是鉴于关于哪个.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 2014年

好问题:) ...是的,我们在Mono上有用户-我不确定他们是否正在使用Serilog的.NET 4.5或4.0版本,但是如果您遇到任何问题,我们都会提供帮助。
Nicholas Blumhardt 2014年

.NET 4.5支持让我立即下载并试用了您的解决方案
Fat Shogun 2014年

8

我也支持NLog,因为它也适用于非托管代码。我想可能可以同时使用log4net和log4cxx,但是NLog可以开箱即用地处理托管和非托管代码。

我还看过Common.Logging,它是对日志记录api的抽象,它支持log4net,NLog和Entreprise Library。我认为我不会使用它,但是我喜欢他们在禁用日志记录时使用lambda来提高性能(与NLog以及其他可能共享的功能)。


4

您可能还会考虑Microsoft Enterprise Library Logging Block。它带有不错的设计师。


3
与手工制作XML相比,使您可以直观地对其进行配置。取决于您的口味...
Rashack 2010年

13
对于此类事情使用可视化工具的想法不是一件好事。
亚当·迪米特鲁克

4
也许不是一件好事,但对于EntLib而言,可视配置器是必需的。手动编写配置实际上是不可能的,它太复杂了(您知道,它来自Microsoft)。
帕维尔·霍德克

1
即使有人不喜欢视觉设计师,为什么还要投票呢!:o
nawfal

EntLib确实会同步记录日志,这实际上会影响性能。
Michael Freidgeim

2

我认为人们普遍认为nlog易于配置和使用。两者都很有能力。


0

根据我的经验,SmartInspect胜过NLog和log4net。

它非常易于使用,文档很棒,您可以查看和过滤以前记录的消息使用其交互式日志查看器,这在现实世界中是一个巨大的优势。

我喜欢的一件事是数据的选项卡式视图,例如Chrome中的浏览器选项卡。每个选项卡都可以提供日志的不同过滤视图。


11
它是一种付费产品。NLog和Log4Net是免费的。
Zo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.