我想了解人们如何在实际应用程序中处理跟踪和登录。这里有一些问题可能有助于解释你的答案。

框架

你使用什么框架?

log4net System.Diagnostics.Trace System.Diagnostics.TraceSource 日志应用程序块 其他的吗?

如果你使用跟踪,你使用Trace.Correlation.StartLogicalOperation吗?

您是手动编写这些代码,还是使用某种形式的面向方面编程来完成这些代码?愿意分享一段代码片段吗?

您是否提供了任何形式的跟踪源粒度?例如,WPF TraceSources允许你在不同的级别上配置它们:

系统。Windows -所有WPF的设置 System.Windows.Animation -重写动画。

听众

您使用什么日志输出?

文本文件 XML文件 事件日志 其他的吗?

如果使用文件,您是使用滚动日志还是单个文件?如何让人们可以使用这些日志?

查看

您使用什么工具查看日志?

记事本 尾巴 事件查看器 系统中心运营经理/微软运营经理 WCF服务跟踪查看器 其他的吗?

如果您正在构建ASP。NET解决方案,你也用ASP。NET运行状况监视?运行状况监控器事件中是否包含跟踪输出?Trace.axd呢?

那么自定义性能计数器呢?


当前回答

答案中有很多很棒的建议。

一般的最佳实践是考虑谁将阅读日志。在我的例子中,它将是客户端站点的管理员。所以我记录消息,给他们一些可以采取行动的东西。例如,“无法初始化应用程序。这通常是由......引起的”

其他回答

作为该工具的作者,我们当然使用SmartInspect来记录和跟踪。net应用程序。我们通常对实时日志使用命名管道协议,对最终用户日志使用(加密的)二进制日志文件。我们使用SmartInspect控制台作为查看器和监视工具。

实际上有相当多的。net日志框架和工具。DotNetLogging.com上有不同工具的概述和比较。

我不得不加入推荐log4net的行列,在我的案例中,从平台灵活性(desktop . net / compact Framework, 32/64位)的角度来看。

但是,将其包装在私有标签API中是一种主要的反模式。log4net。ILogger已经是Commons Logging包装器API的. net对等体,因此耦合已经被最小化,而且由于它也是一个Apache库,通常甚至不需要担心,因为您没有放弃任何控制:如果必须,可以使用它。

我所见过的大多数家用包装器库也会犯一个或多个错误:

Using a global singleton logger (or equivalently a static entry point) which loses the fine resolution of the recommended logger-per-class pattern for no other selectivity gain. Failing to expose the optional Exception argument, leading to multiple problems: It makes an exception logging policy even more difficult to maintain, so nothing is done consistently with exceptions. Even with a consistent policy, formatting the exception away into a string loses data prematurely. I've written a custom ILayout decorator that performs detailed drill-down on an exception to determine the chain of events. Failing to expose the IsLevelEnabled properties, which discards the ability to skip formatting code when areas or levels of logging are turned off.

答案中有很多很棒的建议。

一般的最佳实践是考虑谁将阅读日志。在我的例子中,它将是客户端站点的管理员。所以我记录消息,给他们一些可以采取行动的东西。例如,“无法初始化应用程序。这通常是由......引起的”

我没有资格评论。net的日志,因为我的面包和butter是Java,但是在过去的8年里,我们在日志方面有了一个迁移,你可能会发现一个有用的类比来回答你的问题。

我们从JVM中的每个线程都使用的Singleton记录器开始,并为整个进程设置日志记录级别。如果我们不得不调试系统的一个非常特定的部分,就会产生大量的日志,所以第一个教训是对日志进行分段。

当前的日志记录器允许多个实例,其中一个被定义为默认实例。我们可以实例化任意数量的具有不同日志级别的子日志记录器,但是这种体系结构最有用的方面是能够通过简单地更改日志属性为单个包和类创建日志记录器。第二课是创建一个灵活的系统,允许在不更改代码的情况下重写其行为。

我们使用的是包裹在Log4J周围的Apache公共日志库。

希望这能有所帮助!

*编辑*

After reading Jeffrey Hantin's post below, I realized that I should have noted what our internal logging wrapper has actually become. It's now essentially a factory and is strictly used to get a working logger using the correct properties file (which for legacy reasons hasn't been moved to the default position). Since you can specify the logging configuration file on command line now, I suspect it will become even leaner and if you're starting a new application, I'd definitely agree with his statement that you shouldn't even bother wrapping the logger.

至于面向方面日志,我在另一个SO问题上推荐了PostSharp

面向方面的日志与Unity\T4\任何其他

如果您正在评估日志记录框架,答案中提供的链接值得访问。