我最近被要求为即将开展的项目“原型化一些日志记录”。我之前没有任何日志框架的经验。于是我花了几天时间研究、运行教程、制作玩具应用等,学习了Log4Net、NLog和Enterprise Library。3-4周后回来,把它们结合起来做成一个连贯的演示。希望这对你们有所帮助。
我对我们项目的建议如下:
这些建议基于以下发现(仅代表个人观点!):
显然,我到目前为止很喜欢NLog。但并不足以在有其他解决方案的情况下使用它。
一个很重要但未被广泛讨论的问题是支持和更新。
自2006年4月19日发布版本1.2.10以来,Log4Net从未更新过。
相比之下,NLog自2006年以来一直得到积极支持,最近发布了NLog 2.0,支持许多当log4net最后更新时不存在的平台,例如:
最近我使用过这两个框架,我想分享一下我的看法。
我被要求评估一个现有Web应用程序的日志框架,在浏览了各种在线论坛后,我将选择范围缩小到NLog(v2.0)和log4net(v1.2.11)。以下是我的发现:
NLog的设置/启动非常简单。您可以在他们的网站上通过“入门教程”完成设置工作。你可以得到一个很好的想法,nlog如何工作。配置文件非常直观,任何人都能理解它。例如:如果您想启用内部日志记录,则在Nlog配置文件的头节点中设置标志,这是您期望它的位置。在log4net中,您需要在web.config的appSettings节中设置不同的标志。
在log4net中,内部日志记录不输出时间戳,这很让人恼火。在Nlog中,您可以获得带有时间戳的良好日志。我在我的评估中发现它非常有用。
log4net的过滤器 - 您最好查看我的这个问题 - log4net filter - how to write AND filter to ignore log messages 如果您找到答案/解决方案,请让我知道。我知道,有一种解决方法是编写自己的自定义过滤器。但这在log4net中不易得到。
性能 - 我使用存储过程将约3000条日志消息记录到数据库中。我使用简单的for循环(int i = 0; i < 3000; i ++...)来记录相同的消息3000次。对于写入操作:log4net AdoAppender所需的时间几乎是NLog的两倍。
Log4net不支持异步appender。
这对我来说已经足够比较了,我选择了NLog作为我的日志框架。
对于那些较晚关注本主题的人,您可能需要回顾一下.Net基类库(BCL)。2005年左右,.Net 1.1和.Net 2.0之间引入了TraceSource类,许多人错过了这些更改。
使用TraceSource类类似于其他日志记录框架,具有粒度控制日志记录、在app.config/web.config中配置以及编程访问的功能,而不需要企业应用程序块的开销。
还有许多比较:“log4net vs TraceSource”
对我们来说,关键区别在于整体性能方面。如果您需要低延迟的解决方案,那么根据我们的测试,在 NLog 中查看 Logger.IsDebugEnabled
与 Log4Net 的比较,NLog 的开销要小得多。
祝好, 弗洛里安
首先看看你的堆栈中剩下的部分。
如果你正在使用NHibernate,它直接利用Log4Net。 其他框架可能需要其他特定的日志记录器。
除此之外,两者都可以很好地工作。
我自己选择了Log4Net。配置起来可能有些麻烦,如果配置不正确,找出问题会比较麻烦。但是你可以让它做几乎所有你想要的记录器功能。
如果你还没有使用Log4Net的问题,这里有一篇文章介绍如何入门: http://elegantcode.com/2007/12/07/getting-started-with-log4net/
好的..我曾经使用企业库进行数据库日志记录任务,但由于性能瓶颈,我现在转而使用NLog。
一些比较信息:
http://pauliusraila.blogspot.com/2010/10/solving-database-logging-bottlenecks.html
我同意上面的观点,并且更喜欢nLog。Entlib是过度臃肿的。
关于Log4net,有一件事情总是让我困扰,就是忘记在global.asax中添加以下内容来初始化组件:
log4net.Config.XmlConfigurator.Configure();
如果您访问此处,您可以找到一个全面的矩阵,包括NLog和Log4Net库以及企业库和其他产品。
有人可能会认为该矩阵是以强调矩阵中唯一商业库的功能为目的而制作的。我认为这是真的,但它仍然对我选择NLog很有帮助。
敬礼
我运营一个开源项目,名为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)平台。