这里有很多类似的问题:
您错过了几个常用的日志记录框架。以下是常用框架的列表,您列出了其中的一些:
日志抽象:
System.Diagnostics 插件:
其他
来自 codeplex 的其他几个日志框架(我在 SO 上看到过这里提到的):
为什么你会选择一个而不是另一个?这是一个艰难的。很多都是个人喜好。其中一些是技术(或功能)优势。
任何日志框架(尤其是第三方框架)的一个明显缺点是支持质量。如果您对 log4net、NLog、Common.Logging 等有疑问怎么办?你能从这些框架的开发者那里得到修复吗?这可能不是非常重要,因为源代码可用于这些框架。但是,您可能不希望仅仅为了进行修复或添加增强而“继承”源代码树。我会说这些框架非常可扩展,可以通过正常的扩展点添加许多增强功能。
如果您阅读了我在上面发布的链接,我认为可以公平地说,仅根据好评的数量,log4net 将是明显的“赢家”。它将被更频繁地提及为历史上最喜欢的日志记录以及许多人未来会选择使用的东西。
NLog 有它的支持者,但它似乎没有 log4net 的渗透力或“首要”意识,尽管它们非常相似。 NLog 的功能与 log4net 非常相似,并且它具有最近经历了重要的开发周期的额外优势。
Enterprise Library 通常被吹捧为不错的选择,但几乎同样经常被吹捧为糟糕的选择。也许它的一些负面声誉可能不是那么好早期版本?也许现在好多了?
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 是否应该继续保持其最受青睐的状态。 As has been noted elsewhere here on SO, log4net does not seem to be undergoing a lot of development recently(请注意,我认为“log4net 已死”有点夸张)而 NLog 2.0 目前处于测试阶段,最终版本预计在 2011 年第一季度发布(更新:NLog 2.0 was released 于 2011 年 7 月 17 日)。这是否使 NLog 成为比 log4net 更好的选择?我不知道,但我认为,相对而言,在两者之间进行选择时,NLog 至少应该得到同等的考虑,并且可能应该是新开发的首选,至少在 log4net 开发显示出更多生命迹象之前。
log4net 和 NLog 都提供了非常灵活的配置选项。它们允许您在日志记录语句的定义中具有非常精细的粒度(通过为每种类型定义记录器的“标准”模式)。它们还允许您开发自己的“日志记录目标”对象(log4net Appender 和 NLog 目标)和“格式化”对象(log4net 模式转换器和 NLog LayoutRenderers),从而轻松扩展库。
除了日志框架的选择之外,一些(很多?)主张通过使用抽象层将您的应用程序代码与对特定日志框架的硬依赖隔离开。这可以采用您自己实现的 ILogger 接口的形式,可能在现有框架之上。将来,您可以通过在不同的框架上实现 ILogger 来更改框架。或者,您可以使用 DI/IoC 将“ILogger”注入您的代码。许多 DI/IoC 框架提供了内置的 ILogger 抽象,可以将其配置为使用 log4net、NLog 或 Enterprise Library,或者您可以编写自己的 ILogger 实现并将其注入)。谁在乎实现是什么?另一种使您的代码免受对特定日志框架的硬依赖的方法是使用现有的日志抽象框架,例如 Common.Logging 或 SLF。好处是,您的应用程序不依赖于特定的日志记录框架。但是,有些人会说您刚刚将一个依赖项(在日志框架上)换成了另一个(日志抽象框架)。
关于日志抽象的另外两个注意事项:
-
一个好的日志抽象应该允许您在同一个输出文件中捕获来自不同日志框架的输出。 Common.Logging 将此称为“桥接”。假设您使用 NLog 支持的 Common.Logging 编写了一个应用程序。现在假设您正在使用直接使用 log4net 编写的第三方类库。使用桥接系统,您可以捕获 log4net 输出(通过自定义附加程序)并通过 Common.Logging 重新路由它,以便可以在应用程序日志输出的上下文中查看第三方类库的日志输出。
使用日志抽象还允许您在开发过程中“试驾”日志框架。你可能一开始认为 log4net 就是这样,但你想让自己敞开心扉去尝试 NLog。使用日志抽象可以相对容易地在两者之间切换。最终,您可以选择使用哪个日志框架,但与此同时,您已经能够编写大量不依赖于特定日志框架的代码。
您可能会选择一个框架而不是另一个框架的另一个原因是您工作的环境。如果您已经在使用 Enterprise Library 的一部分,这可能足以促使您使用 Enterprise Library 日志记录。
如果您在 Silverlight 中进行开发怎么办?你可以选择使用Clog - part of Calcium 之类的东西。您也可以选择使用与 Silverlight 和 WP7 兼容的 NLog 2.0。
System.Diagnostics 插件(Ukadc.Diagnostics、Essential.Diagnostics)。这些不是日志框架本身。相反,它们表示可以与现有 System.Diagnostics 框架一起使用的有用对象和扩展点的集合。在我看来,这些插件中的每一个都添加的最好的事情之一是能够格式化日志输出,类似于使用 log4net 和 NLog 格式化它的方式。我没有用过 Essential.Diagnostics,但是我用 Ukadc.Diagnostics 做了实验,觉得它真的很酷。甚至可以轻松编写自己的“格式化标记”。
我不知道这是否完全回答了您的问题(无论如何,这个问题相当广泛),但我认为这里有很多值得思考的地方。