如前所述,NLog 和 log4net 都是很好的日志框架。正如 Jeff 上面提到的,System.Diagnostics 也是一个合理的选择(不仅仅是记录到 EventLog)。尝试为我的回答增加一些价值,而不仅仅是重复已经说过的话,您可以使用TraceSources 和免费的Ukadc.Diagnostics library from codeplex 来增强您的 System.Diagnostics 日志记录。
使用 TraceSources,您可以创建“命名记录器”,类似于您在 NLog 和 log4net 中的操作方式。这些 TraceSource 可以配置为在特定级别进行日志记录(每个 TraceSource 不同),并且可以将它们发送到各种目的地(TraceListeners)。所有 TraceSource 都可以记录到同一个侦听器,或者一些可以记录到一些侦听器,而另一些则记录到其他侦听器。任何 TraceSource 也可以发送到多个 TraceListener。
以下是在代码中使用 TraceSources 的方式(假设在 app.config 文件中已配置 TraceSource“abc”以记录“Info”和更高优先级的消息,并已配置为记录到文件“log.txt” ")。
public class MyClass
{
static TraceSource ts = new TraceSource("abc"); //Common idiom for NLog and log4net, not sure if as common for TraceSource
public void Func1(int x)
{
ts.Information("Entering Func1");
ts.Verbose("x = {0}", x); //Won't log if "abc" is configured to log Info and HIGHER messgaes
ts.Information("Exiting Func1");
}
}
与“普通” TraceSources 相比,Ukadc.Diagnostics 的一个巨大优势是您可以配置 NLog/log4net 样式的输出格式,以便您可以更好地控制日志输出中显示的字段和格式。
在 System.Diagnostics 中不可用的 NLog/log4net 中非常有用的三件事是:
能够自动记录呼叫站点信息(方法/功能)
附加日志记录上下文(GDC - 全局日志记录属性,MDC - NLog/log4net 用语中的线程日志记录属性)。 System.Diagnostics 确实有 Trace.CorrelationManager.LogicalOperationStack,类似于 NDC。
分层记录器。
分层记录器意味着您可以配置“祖先”记录器,并且任何“后代”记录器都将继承这些设置。例如,假设您有一个类,其完全(命名空间)限定类型名称是 Namespace1.Namespace2.Class。使用 NLog/log4net,您可以为“Namespace1”配置日志信息(级别、目标),如果您请求基于 Namespace1 中任何类型的完全限定名称的记录器,它将继承 Namespace1 的设置。通过查看 Castle implemented their TraceSource-based logging 抽象的方式,您可以使用 TraceSources 实现类似的目标。特别是,查看 Initialize 函数。它很容易开始工作(在您自己的 TraceSource 周围的瘦包装器中),并且作为附带的好处,使 TraceSource 的配置更容易一些,因为您不必单独配置每个 TraceSource。请注意,如果没有找到实际的祖先,您可以通过配置名为“”的 TraceSource 并在 Castle 方案中添加一些代码以默认为“”配置来轻松添加具有“根”配置的功能.例如,您可以将“*”配置为登录,例如 Verbose,然后专门将某些 TraceSource(按类或按命名空间)配置为关闭或处于不同级别。如果没有分层记录器,要使用 TraceSources 执行相同的操作,您需要将每个 TraceSource 配置为以“详细”记录,而您想要详细记录。
虽然我谈了很多关于类和命名空间的记录器,但 NLog、log4net 和 TraceSources 都允许您将记录器名称定义为任意字符串。因此,您可以通过功能区域而不是命名空间/类来冷定义记录器层次结构:
Database
Database.Connect
Database.Query
Database.Update
Database.SQL
Amazon
Amazon.Books
Amazon.Books.Fiction
Amazon.Books.Nonfiction
Amazon.Electronics
Amazon.Electronics.Video
Amazon.Electronics.Music
Amazon.Electronics.Computer
因此,您可以打开“Amazon”日志记录和所有 Amazon 内容日志(无需显式配置每个“子”TraceSource),而数据库内容则不会。或者,您可以打开 Amazon 并关闭 Amazon.Electronics,然后只有 Amazon.Books(和儿童)会登录。
最后,如果你使用 NLog 或 log4net,值得一提的是,NLog 刚刚发布了一个新版本,NLog 2.0,(测试版)。