您可以在 StackOverflow 上通过更广泛的谷歌搜索找到大量有关 log4net 和 NLog 的信息。
您还可以找到很多有关 System.Diagnostics 的信息。关于 System.Diagnostics 需要注意的一件事是,我认为您会在 StackOverflow 上找到很多有关使用 Debug.Write/WriteLine 和 Trace.Write/WriteLine 的参考资料。可以说“更好”的方法是使用 TraceSources。 TraceSources 类似于 log4net 和 NLog 中的记录器。 TraceSources 允许您对日志消息有更高的粒度,从而更容易地打开和关闭一些日志记录(除了按级别之外,还按类别或类别)。与 log4net 和 NLog 相比,TraceSource 确实有一个缺点,即您在代码中创建的每个 TraceSource 都必须在 app.config 中显式配置(如果您希望它实际记录)。
log4net 和 NLog 有一个分层概念,如果您请求的确切记录器未明确配置,则会检查其“祖先”以查看是否配置了任何“祖先”,如果配置了,则请求的记录器“继承”这些设置。祖先只是记录器名称中由“.”分隔的部分。 (因此,如果您请求一个名为"ABC.DEF.GHI"
,祖先将是"ABC.DEF"
, and "ABC"
)。也可以(必需?)在 app.config 中有一个“根”记录器配置,如果未显式配置且未配置祖先,则所有记录器请求都将回退到该配置。因此,您可以仅配置一个“根”记录器以在特定级别进行记录,并且代码中的所有记录器都将在该级别进行记录。或者,您可以将“根”记录器配置为“关闭”,然后显式打开一个或多个记录器(或通过配置祖先)。通过这种方式,除了那些已配置的记录器之外,没有记录器会记录日志。
如果你看here https://github.com/castleproject/Core/blob/master/src/Castle.Core/Core/Logging/TraceLogger.cs,您会发现 System.Diagnostics TraceSources 周围有一个有趣的包装器,它提供了与 log4net 和 NLog 非常相似的继承功能。
为了显示:
log4net 和 NLog 中记录器的常见使用模式是获取如下记录器:
//log4net
static ILog logger = LogManager.GetLogger(
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
//NLog
static Logger logger = LogManager.GetCurrentClassLogger();
在这两种情况下,记录器的名称都将是完全限定的类型名称。
在 app.config 文件中,如果需要,您可以仅配置“根”记录器,并且两个记录器都将继承根记录器的设置(级别、附加程序/目标等)。或者,您可以为某些名称空间配置记录器。在该命名空间中定义类型的任何记录器都将继承这些记录器设置。
log4net 和 NLog 已经讲够了,您可能已经知道它们是如何工作的。
上面的链接说明了一个基于 TraceSource 的包装器,它允许类似的配置。所以,如果你愿意,你可以在课堂上做这样的事情:
static TraceSource ts = new TraceSource(
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
使用上面链接的包装器,您可以在更高级别(类/命名空间层次结构,而不是级别)配置 TraceSource 并继承较低级别记录器中的这些设置。
因此,如果您的完全限定类型名称类似于:ABC.DEF.GHI,那么您可以为 ABC 或 ABC.DEF(命名空间级别)配置 TraceSource,并且类“GHI”将继承这些设置。这确实可以减少您必须执行的配置量。
请注意,您不限于(使用任何这些日志记录平台)使用类的类型或类型名称来获取记录器。您可以定义自己的记录器命名方案,可能基于功能区域(“通信”、“通信.发送”、“通信.接收”等)。同样,您可以以最高粒度(或不是最高粒度)请求记录器/TraceSource,然后以任何有意义的粒度级别进行配置。
因此,您可以在代码中请求记录器,如下所示:
ILog logger = LogManager.GetLogger("Communication.Receive");
ILog logger = LogManager.GetLogger("Communication.Send");
Logger logger = LogManager.GetLogger("Communication.Receive");
Logger logger = LogManager.GetLogger("Communication.Send");
TraceSource ts = new TraceSource("Communication.Receive");
TraceSource ts = new TraceSource("Communication.Send");
如果您在 app.config 文件中仅配置“通信”,则所有记录器都将继承这些设置(因为它们是“通信”的后代)。如果仅配置“Communication.Receive”,则仅“Communication.Receive”记录器会进行记录。 “通信.发送”记录器将被禁用。如果同时配置“Communication”和“Communication.Receive”,则“Communication.Receive”记录器将在“Communication.Receive”设置中记录,而“Communication.Sender”记录器将在“Communication”设置中记录。在 log4net 和 NLog 中,继承的内容可能不止这些,但我了解的还不够多,无法深入探讨。
使用 System.Diagnostics 时您错过的一件事是非常轻松地格式化日志输出格式的灵活性。有一个第三方库为基于 TraceSource 的日志记录提供了非常好的可配置格式。你可以找到它here http://ukadcdiagnostics.codeplex.com/.
我用过通用日志记录 http://netcommon.sourceforge.net/一些。主要用于原型设计,但我可能会在下一个项目中使用它。它工作得很好,并且编写自己的日志记录抽象来插入它相对容易(例如,如果您想编写类似于我上面链接的 TraceSource 抽象)。 Common.Logging 目前缺少的两个重要内容(尽管他们的网站称它们计划在“下一个”版本中发布)是日志记录上下文(例如 log4net 和 NLog NDC/MDC/GDC 对象以及 System.Diagnostics.CorrelationManger.LogicalOperationStack) )和 Silverlight 兼容性。使用 Common.Logging 时,您仍然可以与代码中的 log4net 或 NLog 上下文对象进行交互,但这违背了它的目的,不是吗?
不知道有没有帮到你!
以下是我对 log4net、NLog 和 TraceSource 的一些要点:
log4net - 非常流行,可能需要一些更新 - 至少是基于 .NET 4.0 构建的,最后一次发布是在几年前,非常灵活。
NLog - 在很多方面与 log4net 非常相似,现在是新版本(NLog 2.0 的测试版刚刚发布)
TraceSource - 没有第三方依赖性,无需您(或某人)付出任何努力,不像 log4net 或 NLog 那样强大(关键缺陷 - 记录器层次结构、输出格式 - 都可以通过上面的链接轻松寻址),Microsoft 检测了它们的许多组件使用 System.Diagnostics,这样您就可以获得 Microsoft 的日志输出和您的日志输出交错。 (通常,在其他日志系统中捕获 System.Diagnostics 很容易,因此可能不是大问题)。
虽然我没有经常使用 log4net 或 NLog,但在两者之间我会倾向于 NLog,主要是因为刚刚发布的新版本(测试版)。我认为 TraceSource 也是一个合理的(如果更基本的)选择,特别是如果您实现记录器层次结构并使用上面链接的 Ukadc.Diagnostics 库。
或者,使用 Common.Logging,您可以避免或延迟为底层日志记录平台做出决定,直到您准备好为止。无论如何,对我来说,Common.Logging 的一个非常有用的方面是,您可以在开发产品时“测试驱动”日志平台,而无需更改任何应用程序代码。您不必等到决定使用特定的日志记录平台才能将日志记录添加到代码中。现在通过 Common.Logging api 添加它。当您接近交付时,您应该缩小日志平台的选择范围。使用该平台进行交付(如果您重新分发日志记录平台),就完成了。如果您愿意,以后仍然可以更改。