System.Diagnostics.Debug命名空间与其他日志记录解决方案(log4net,MS Enterprise Library等)

时间:2010-07-09 14:20:34

标签: .net log4net enterprise-library system.diagnostics

我目前正在调查.net项目的各种日志记录可能性,我无法在System.Diagnostics.Debug / Trace功能和第三方库(如log4net,MS Enterprise Library,NLog等)之间做出决定。
目前我已经发现了这个:

  • System.Diagnostics相当难以配置和使用,因为您需要显式配置所有侦听器,过滤器,源等。它似乎也缺少对DB的批量插入(想想写入100'000日志每个条目都有自己的插入,恐怖,不是吗?)。但是对于某些人而言,不使用额外的库来进行像Logging这样的“基本”事情被认为是“酷”(当然,在某些时候,减少项目所依赖的第三方库的数量是有意义的,但这次不是,我想)
  • 第三方功能更强大,通常更快,更容易使用,但配置有时也会很痛苦,而且这些库通常不太可靠(例如EntLib等神秘突然停止记录)。
  • Common.Logging怎么样?是否值得尝试(因为,正如我所听到的,它提供了插入各种日志框架,并且就像应用程序和所需的lib之间的接口一样)?


如果有人能指出我正确的方向或纠正(或添加一些东西)给我上面给出的比较,我将非常感激!也许如果你鼓励我使用第三方,你可以建议一些特定的一方(考虑到我们的应用程序很可能不需要任何花哨的东西,如UDP,滚动文件等 - 只是普通文件,电子邮件,数据库和事件簿)?
提前致谢!

4 个答案:

答案 0 :(得分:23)

答案 1 :(得分:0)

我知道这是旧的,但如果你保持简单,System.Diagnostics.Trace很容易配置。我多年来一直在使用简单的文本编写器配置块,直接复制出MSDN文档。

没有人经常提及这一点,但在您的代码中,您可以使用内置的 Trace.TraceInformation,Trace.TraceWarning和Trace.TraceError 来轻松隔离3级跟踪输出和然后在配置文件中选择要输出的级别(参见下面的配置)。如果在配置的“EventTypeFilter”中选择“信息”,则会在输出中获得全部3。如果选择“错误”,则只会在输出中收到TraceError消息。大多数时候,我只是将我的错误留给我,所以如果我的应用程序确实发生了某些事情,我的跟踪文件中已经有了这个输出。在我的Catch块中,我将添加TraceError代码以输出有用的信息。 TraceInformation适用于输出您已经通过的代码中的时间或点等内容,并沿途转储变量值。 TraceWarning适用于可处理但不可取的事情 - 比如Web服务可能需要很长时间才能完成,或者返回的数据记录数量超过可能导致未来问题的阈值。

有一个小缺点,因为所有这些跟踪代码行仍然执行,无论编译级别如何。如果将它们设置为不输出,则应该减少开销。但是,如果您正在编写高性能代码,则可能需要将这些行包装在条件编译标记中。

<system.diagnostics>
  <sharedListeners>
    <add name="MyTraceListener" traceOutputOptions="DateTime" type="System.Diagnostics.TextWriterTraceListener, System, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" initializeData="MyApplicationName_Trace.log">
     <!--
        Off - Does not allow any events through. 
        Error - Allows Error events through. 
        Warning - Allows Error, and Warning events through. 
        Information - Allows Error, Warning, and Information events through. 
     -->
     <filter type="System.Diagnostics.EventTypeFilter" initializeData="Error" />
    </add>
  </sharedListeners>
  <trace autoflush="true" indentsize="4">
    <listeners>
       <add name="MyTraceListener" />
    </listeners>
  </trace>
</system.diagnostics>

答案 2 :(得分:-1)

从开发人员的角度来看,类似于orm的关注问题不应该是手写的。有很多优秀的第三方图书馆。当然,有时需要进行一些配置工作,但将其与手动滚动你自己的解决方案相比,它只是水中的一滴水。

我个人的偏好是log4net,但这取决于您的需求。我最好的建议是查看log4net或EntLib Logging Application Block等解决方案的文档,并做出最适合您的决定。

答案 3 :(得分:-1)

记录和跟踪是不同的问题。记录与操作反馈有关。跟踪(包括Debug方法提供的跟踪)与开发和测试有关。不应将跟踪代码编译到发布程序集中。 Trace和Debug类通过编译器注释(ConditionalAttribute)实现此目的。应优化此类代码以收集大量数据,而不是性能。另一方面,操作日志记录需要根据系统管理员/运营团队的要求针对性能和更广泛的存储机制进行优化。

因此,我建议使用Trace / Debug进行开发,以及使用更强大的日志记录包进行操作。