如前所述,NLOG和log4net的都是很好的日志框架。正如Jeff在上面提到的,System.Diagnostics也是一个合理的选择(不仅仅是记录到EventLog)。试图给我的答案增加一些价值,而不是仅仅喋喋不休地说,你可以使用TraceSources和免费的Ukadc.Diagnostics library from codeplex来增强你的System.Diagnostics日志记录。
使用TraceSources,您可以创建“命名记录器”,类似于您可以在NLog和log4net中执行的操作。这些TraceSources可以配置为在某些级别上记录(每个TraceSource都不相同),并可以将它们发送到不同的目标(TraceListeners)。所有TraceSources都可以登录到同一个监听器,或者一些可以登录到某些监听器,而其他监听器则可以登录到其他监听器。任何TraceSource也可以发送到多个TraceListeners。
这里是您如何在代码中使用TraceSources(假设TraceSource“abc”已在app.config文件中配置为记录“Info”和更高优先级的消息并且已配置为登录到文件“log”。文本”)。
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");
}
}
一个巨大Ukadc.Diagnostics的利益,在“普通” TraceSources,是可以配置的NLOG/log4net的风格输出格式,所以你可以有在什么领域在日志产出和显示更多的控制格式。
三件事情是非常有用的,从NLOG/log4net的不可用在System.Diagnostics程序是:
能够自动记录通话网站的信息(方法/功能)
附加日志上下文(GDC - 全局日志记录属性,MDC - NLog/log4net说法中的线程日志记录属性)。 System.Diagnostics的确有Trace.CorrelationManager.LogicalOperationStack,它与NDC类似。
Hierarichal伐木工。
分层记录器意味着你可以配置一个“祖先”记录器和任何“后代”记录器将继承这些设置。例如,假设您有一个完全(名称空间)限定类型名称为Namespace1.Namespace2.Class的类。使用NLog/log4net,您可以为“Namespace1”配置日志信息(级别,目标),并且如果您根据Namespace1中任何类型的完全限定名称请求记录器,它将继承Namespace1的设置。您可以通过查看Castle implemented their TraceSource-based logging抽象如何使用TraceSources实现与此类似的功能。特别是,看看Initialize函数。在TraceSource的自定义小包装器中工作起来非常容易(作为一个优点),使得TraceSources的配置更容易一些,因为您不必单独配置每个TraceSource。请注意,如果没有找到实际的祖先,您可以通过配置一个名为“”的TraceSource并在城堡方案中添加一些代码,默认为“”配置,从而轻松添加具有“根”配置的功能。例如,您可以配置“*”来登录,比如说Verbose,然后特定配置某些TraceSources(按类或名称空间)关闭或处于不同的级别。如果没有hierarichal记录器,要使用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
所以,你可以打开“亚马逊”的日志记录和所有亚马逊的东西日志(而无需显式配置每“孩子”TraceSource)和数据库的东西不会。或者,您可以关闭Amazon并关闭Amazon.Electronics,并且只有Amazon.Books(和儿童)才能登录。
最后,如果你使用NLog或log4net,值得一提的是NLog刚刚发布了一个新版本NLog 2.0(测试版)。
+1为线程安全点,但只有主线程推送日志事件。感谢您的全面回答。 – 2010-10-14 18:08:34