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

框架

你使用什么框架?

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

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


当前回答

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

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

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

编辑:

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

其他回答

你使用什么框架?

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

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

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

您使用什么日志输出?

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

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

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

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

我不经常在asp.net中开发,但是当涉及到记录器时,我认为许多最佳实践是通用的。以下是我多年来对日志的一些随机想法:

框架

Use a logger abstraction framework - like slf4j (or roll your own), so that you decouple the logger implementation from your API. I have seen a number of logger frameworks come and go and you are better off being able to adopt a new one without much hassle. Try to find a framework that supports a variety of output formats. Try to find a framework that supports plugins / custom filters. Use a framework that can be configured by external files, so that your customers / consumers can tweak the log output easily so that it can be read by commerical log management applications with ease. Be sure not to go overboard on custom logging levels, otherwise you may not be able to move to different logging frameworks.

日志输出

Try to avoid XML/RSS style logs for logging that could encounter catastrophic failures. This is important because if the power switch is shut off without your logger writing the closing </xxx> tag, your log is broken. Log threads. Otherwise, it can be very difficult to track the flow of your program. If you have to internationalize your logs, you may want to have a developer only log in English (or your language of choice). Sometimes having the option to insert logging statements into SQL queries can be a lifesaver in debugging situations. Such as:

    -- Invoking Class: com.foocorp.foopackage.FooClass:9021
    SELECT * FROM foo;

You want class-level logging. You normally don't want static instances of loggers as well - it is not worth the micro-optimization. Marking and categorizing logged exceptions is sometimes useful because not all exceptions are created equal. So knowing a subset of important exceptions a head of time is helpful, if you have a log monitor that needs to send notifications upon critical states. Duplication filters will save your eyesight and hard disk. Do you really want to see the same logging statement repeated 10^10000000 times? Wouldn't it be better just to get a message like: This is my logging statement - Repeated 100 times

也看看我的这个问题。

我不得不加入推荐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.

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

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

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

编辑:

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

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

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

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