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

框架

你使用什么框架?

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呢?

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


当前回答

你使用什么框架?

我们混合使用了日志应用程序块和一个自定义日志助手,它围绕。net框架工作。LAB被配置为输出相当广泛的日志文件,包括用于服务方法进入/退出的单独通用跟踪文件和用于意外问题的特定错误文件。配置包括日期/时间、线程、pId等,用于调试辅助,以及完整的异常细节和堆栈(在意外异常的情况下)。

自定义日志助手使用Trace。相关性和在WF的日志记录上下文中特别方便。例如,我们有一个调用一系列顺序工作流的状态机。在每个调用活动中,我们记录开始(使用StartLogicalOperation),然后在结束时,使用gereric返回事件处理程序停止逻辑操作。

当尝试调试复杂业务序列中的故障时,这已经被证明是有用的,因为它允许我们根据活动执行序列更快地确定If/Else分支决策等。

您使用什么日志输出?

我们使用文本文件和XML文件。文本文件是通过应用程序块配置的,但我们也从WF服务获得了XML输出。这使我们能够捕获运行时事件(持久性等)以及通用业务类型异常。文本文件是按日期和大小滚动的日志(我认为1MB的总大小是滚动点)。

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

我们正在使用记事本和WCF服务跟踪查看器,这取决于我们正在查看的输出组。如果你的输出设置正确,WCF Service Trace Viewer是非常非常方便的,它可以使读取输出变得更简单。也就是说,如果我大致知道错误在哪里-只是阅读一个带注释的文本文件也很好。

日志被发送到单个目录,然后根据源服务将该目录划分为子目录。根目录是通过一个网站公开的,该网站的访问由一个支持用户组控制。这使我们可以查看生产日志,而不必提出请求,并通过冗长的繁文缛节流程获取生产数据。

其他回答

我们在web应用程序中使用log4net。

当应用程序在运行时出现故障,需要查看更多信息时,它可以通过更改XML配置文件在运行时自定义日志记录。

它还允许您锁定要登录的特定类或属性。当您知道错误发生在哪里时,这是非常方便的。一个经典的例子是NHibernate,你想看到的只是SQL进入数据库。

编辑:

我们将所有事件写入数据库和Trace系统。我们用于错误或异常的事件日志。我们将大多数事件记录到数据库中,这样我们就可以创建自定义报告,如果用户想从应用程序中查看日志的话。

我们在工作中使用Log4Net作为日志记录提供者,并为日志实例使用单例包装器(尽管单例正在审查中,质疑它们是否是一个好主意)。

我们选择它的原因如下:

在各种环境上进行简单的配置/重新配置 良好的预建附件数量 我们用的一个CMS已经内置了 大量的日志级别和相关配置

我应该提一下,这是从ASP讲的。NET开发的观点

我可以看到使用. net框架中的Trace的一些优点,但我并不完全相信它,主要是因为我使用的组件并没有真正执行任何Trace调用。据我所知,我唯一经常使用的是System.Net.Mail。

所以我们有一个包装log4net的库,在我们的代码中,我们只需要这样的东西:

Logger.Instance.Warn("Something to warn about");
Logger.Instance.Fatal("Something went bad!", new Exception());

try {
  var i = int.Parse("Hello World");
} catch(FormatException, ex) {
  Logger.Instance.Error(ex);
}

在方法中,我们检查日志记录级别是否启用,这样就不会对log4net API进行冗余调用(因此,如果Debug未启用,调试语句将被忽略),但当我有时间时,我将更新它以公开这些语句,以便您可以自己进行检查。这将防止在不应该进行的情况下进行评估,例如:

Logger.Instance.Debug(string.Format("Something to debug at {0}", DateTime.Now);

这将变成:

if(Logger.DebugEnabled) Logger.Instance.Debug(string.Format("Something to debug at {0}", DateTime.Now);

(节省了一点浪费时间)

默认情况下,我们在两个位置进行日志记录:

网站的文件系统(未提供的文件扩展名) 电子邮件发送错误和致命

文件以每天卷或10mb (IIRC)的方式完成。我们不使用EventLog,因为它需要比我们通常想要的站点更高的安全性。

我发现记事本可以很好地读取日志。

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

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

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

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

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

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

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