我应该何时使用Tracing vs Logger.NET,Enterprise Library,log4net或Ukadc.Diagnostics?

goo*_*ate 40 .net log4net enterprise-library system.diagnostics nlog

如何在标准跟踪,Logger.NET,企业库,log4net或Ukadc.Diagnostics之间进行选择?

是否存在一个比另一个更合适的情况?那会是什么?(ASP.NET,控制台应用,Azure云,SOHO,企业...)

有什么好处或缺点?

我是否错过了其他主要的日志记录框架?

wag*_*ghe 101

SO上有许多类似的问题:

您错过了几个常用的日志框架.以下是常用框架的列表,其中一些是您列出的:

记录抽象:

System.Diagnostics插件:

其他

来自codeplex的其他一些日志框架(我在这里提到过SO):

为什么你可以选择一个而不是另一个?这是一个艰难的.很多是个人偏好.其中一些是技术(或功能)优势.

任何日志框架(特别是第三方框架)的一个明显缺点是支持的质量.如果您遇到log4net,NLog,Common.Logging等问题怎么办?您是否能够从这些框架的开发人员那里获得修复?这可能不是非常重要,因为源代码可用于这些框架.但是,您可能不希望"继承"源树只是为了进行修复或添加增强.我会说框架是如此可扩展,可以通过普通的扩展点添加许多增强功能.

如果您阅读我上面发布的链接,我认为可以公平地说,仅基于有利的提及量,log4net将是明确的"赢家".它将更频繁地被提及作为历史记录的最爱和许多人将选择使用的东西.

NLog有它的支持者,它似乎没有log4net所具有的渗透性或"头脑"意识,即使它们非常相似.NLog的功能与log4net非常相似,它具有最近经历了重要开发周期的额外优势.

企业图书馆经常被吹捧为一个不错的选择,但几乎同样经常被吹捧为一个糟糕的选择.也许它的一些负面声誉可能不是那么好的早期版本?也许现在好些了?

System.Diagnostics通常被推荐为一个合理的选择,至少有三个强大的好处:没有第三方依赖,许多Microsoft组件都配有System.Diagnostics,它很容易扩展(可能是为了添加一些已经"免费"存在的功能)在log4net和NLog等框架中?).如果你使用System.Diagnostics,我认为使用TraceSource对象而不是Trace.WriteLine/Debug.WriteLine的共识是(我的建议).

另请注意,System.Diagnostics和WCF可以很好地协同工作.可以使用System.Diagnostics记录WCF消息流量,WCF还将跨WCF服务边界调用传播System.Diagnostics活动信息(System.Diagnostics.CorrelationManager.ActivityId).

我不太确定log4net应该继续保持其最受青睐的状态. 正如SO在其他地方已经注意到的那样,log4net最近似乎没有经历太多的发展(注意我认为"log4net已经死了"是夸大其词)而NLog 2.0目前处于测试阶段,最终版本预计将在第一季度发布2011年(更新:NLog 2.0 于2011年7月17日发布).这是否使NLog明显比log4net更好?我不知道,但我认为,相对而言,NLog在两者之间进行选择时至少应该得到相同的考虑,并且可能应该是新开发的假设,至少在log4net开发显示更多生命迹象之前.

log4net和NLog都提供非常灵活的配置选项.它们允许您在日志记录语句的定义中具有非常精细的粒度(通过为每种类型定义记录器的"标准"模式).它们还允许您开发自己的"日志目标"对象(log4net Appenders和NLog Targets)和"格式化"对象(log4net模式转换器和NLog LayoutRenderers),以便轻松扩展库.

除了日志框架选择之外,还有一些(很多?)提倡通过使用抽象层来使应用程序代码与特定日志框架的硬依赖性隔离开来.这可以采用您自己的ILogger接口的形式,也可以在现有框架之上.将来,您可以通过在不同的框架上实现ILogger来更改框架.或者,您可以使用DI/IoC将"ILogger"注入代码中.许多DI/IoC框架提供了一个内置的ILogger抽象,可以配置为使用log4net,NLog或Enterprise Library,或者您可以编写自己的ILogger实现并注入它.谁在乎实施是什么?将代码与特定日志框架的硬依赖性隔离开来的另一种方法是使用现有的日志记录抽象框架,例如Common.Logging或SLF.好处是,您的应用程序不再依赖于特定的日志记录框架.但是,有些人会说你刚刚为另一个(日志抽象框架)交换了一个依赖项(在日志框架上).

关于记录抽象的另外两个注意事项:

  1. 良好的日志记录抽象应该允许您在同一输出文件中捕获来自不同日志记录框架的输出.Common.Logging称之为"桥接".假设您使用Common.Logging编写了一个应用程序,由NLog支持.现在说你正在使用直接使用log4net编写的第三方类库.使用桥接系统,您可以捕获log4net输出(通过自定义appender)并通过Common.Logging重新路由它,以便可以在应用程序的日志记录输出的上下文中查看第三方类库的日志输出.

  2. 使用日志记录抽象还允许您在开发期间"测试驱动器"日志框架.你可能会开始认为log4net是那种方式,但你想让自己开始尝试NLog.使用日志记录抽象,在两者之间切换相对容易.最终,您可以选择哪个日志框架,但与此同时,您已经能够编写大量代码,这些代码不依赖于特定的日志框架.

您可能选择一个框架而不是另一个框架的另一个原因是您工作的环境.如果您已经在使用Enterprise Library的一部分,那么这可能足以促使您使用Enterprise Library日志记录.

如果您在Silverlight中开发,该怎么办?您可以选择使用像Clog这样的东西- 钙的一部分.您也可以选择使用NLog 2.0,它兼容Silverlight和WP7.

System.Diagnostics程序插件(Ukadc.Diagnostics,Essential.Diagnostics).这些不是日志框架本身.相反,它们代表可以与现有System.Diagnostics框架一起使用的有用对象和扩展点的集合.在我看来,最好的事情之一就是每个插件都添加了格式化日志输出的能力,类似于使用log4net和NLog格式化它的方式.我没有使用过Essential.Diagnostics,但我已经尝试过Ukadc.Diagnostics并认为它非常酷.编写自己的"格式化令牌"甚至很容易.

我不知道这是否完全回答了你的问题(无论如何都是相当广泛的),但我认为这里有很多值得思考的东西.

  • 我想就结束这个问题进行投票,因为这已经被问过数百次了.但是,你的答案非常好.它确实为SO已经给出的答案增加了价值.出于这个原因,没有投票结束,但为你+1. (5认同)
  • +100万,感谢您的回答,这似乎来自经验和广泛的知识! (2认同)
  • 有关上面列出的主要日志记录框架(System.Diagnostics,log4net,NLog和Enterprise Library)的比较(包括性能比较),请参阅https://essentialdiagnostics.codeplex.com/wikipage?title=Comparison (2认同)

小智 5

我刚开始在VS2010中使用log4net并发现它依赖于System.Web ...这使得它与".NET xx Client Profile"框架目标不兼容......考虑到这里有人发布了关于Windows Update的内容客户端配置文件作为.NET可再发行组件的选择,这意味着如果您希望在大多数计算机上运行代码,则log4net不再是选择的记录器...

感谢关于其他选项的信息 - 我会检查出来的......