1

为了清楚起见,我对“方面”的含义是应用程序功能的水平因素,而不是像面向方面编程中那样拦截所有方法调用。

我刚刚发现了 .NET Trace 基础结构的美妙之处,尤其是TraceSource对象。就像我这个菜鸟一样,我给每个类它自己的 TraceSource,跟踪方法开始和结束,错误等。

但是,现在,我认为TraceSource每个方面都更好。例如,我有一个应用程序可以导入停车场内的车辆移动记录,计算停车费,然后将消息发布到计费系统 (WHMCS)。

我在想我应该有一个具有一堆静态TraceSource属性的类,如下所示:

public static class Traces
{
    static Traces()
    {
        VehicleMovements = new TraceSource("VehicleMovements", SourceLevels.All);
        Pricing = new TraceSource("Pricing", SourceLevels.All);
        Calculation = new TraceSource("Calculation", SourceLevels.All);
        Billing = new TraceSource("Billing", SourceLevels.All);
    }
    public static TraceSource VehicleMovements { get; set; }
    public static TraceSource Pricing { get; set; }
    public static TraceSource Calculation { get; set; }
    public static TraceSource Billing  { get; set; }
}

这样,我可以做,例如,Traces.Pricing.VehicleMovements ("Terminal Id not configured");在我发现该场景的任何课程中,并有一个更好的分组和更有凝聚力的日志或其他输出。

这是一个好主意吗?作为奖励,一些关于跟踪策略和模式的资源的指针会很棒,谢谢。

4

2 回答 2

1

抱歉,这将更像是程序员 SE 的答案。您展示的特定代码是基于主题的跟踪的一个很好的示例,而不是基于类的跟踪。它是好是坏取决于您试图生成什么样的故事,以及该故事是否提供了您理解问题和发现错误所需的信息。

在我读了一本书,作者采访了一群著名的开发人员并询问他们如何调试后,我得到了跟踪“痴迷”并开始跟踪一切——几乎所有人都说他们回到了某种在战略上将消息写入屏幕的方式点。所以可能/应该有一种方法来正式化这种做法,对吧?

所以我开始使用 System.Diagnostics——它的主要优点是它始终可用。它是一个有缺陷的 API,nLogger 和 log4net 是更优雅的 API。但是 System.Diagnostics 是可扩展的,并且修复了很多缺陷——我总是将 Essential.Diagnostics 和 Ukadc 库与 System.Diagnostics 和一些我自己的自定义侦听器一起使用。

Aspect Oriented Trace 这意味着在每个方法调用之前和之后添加跟踪语句。这是非常健谈的,并且在出错时,它提供的信息大部分与堆栈跟踪相同。大多数性能跟踪使用这种策略来找出哪些方法被调用了太多次,或者哪些方法在单个调用或集体调用中消耗了太多时间。

基于类的跟踪 跟踪变得非常健谈。在微软,他们将跟踪页面称为“Spew”,如果没有特别考虑到跟踪的内容,它可能会像呕吐物一样提供信息。这是每个类一个 TraceSource 的动机,这样您就可以只为您关心的一两个类打开跟踪。

主题基础跟踪 我尝试对每个类使用 TraceSource,但我发现我的应用程序(以 db 为中心的 Web 应用程序)确实需要基于主题的跟踪。所以我有“perf”、“http”、“data”、“sql”和“app”的跟踪源。Perf 是与执行时间相关的任何内容,http 是有关请求和响应的信息,data 将数据转储到屏幕上,当我得到它时,sql 将 sql + 参数转储到屏幕上。在我的工作流程中,我几乎一直打开主题库跟踪,并且通常关闭类库跟踪,除非有特定问题。

生产/测试团队跟踪 跟踪和错误记录有很多重叠之处。Trace 讲述了这个故事,错误日志记录了出了什么问题。收集跟踪可能会很昂贵,但如果我在错误发生时有跟踪,有时这很有用。目前,在生产中,我将跟踪写入内存,然后将该跟踪包含在电子邮件错误报告中。生产跟踪和错误记录必须比开发跟踪更精细地调整,因为过度喷射会产生更严重的后果,例如性能不佳或开发运营团队因为记录不重要的问题而忽略了错误日志中的重要错误。

这是我在尝试为跟踪制定一些规范指南时写的关于跟踪的博客文章http://suburbandestiny.com/Tech/?p=640 因为 API 的常见建议就像跟踪(这个 API 是如此强大你可以将它用于任何你想做的事情!)实际上并没有那么强大。

于 2013-06-13T11:29:24.937 回答
0

在 Essential.Diagnostics 项目的文档中,该项目包含一堆扩展 System.Diagnostics (TraceSource) 的侦听器,我有几页关于指南的内容。(我参与了 Essential.Diagnostics 项目)

我不会在这里复制整个文档,但会尝试给出一个摘要,以便答案可以独立。

(1) 跟踪级别——评级为严重、错误和警告的消息可能总是希望被跟踪,甚至可能写入 Windows 事件日志之类的东西,并且能够关闭可能没有意义。

在信息级别,有一些全局事件,例如服务启动,您总是想要记录,以及每个事务的事件,它们可能有自己的自定义(高度结构化)应用程序日志文件(例如 IIS 日志)。您的代码应确保错误报告、应用程序日志和较低级别的跟踪之间存在一致性(否则会令人困惑)。

下面是所有详细的东西——在这一点上它可能很多,单个开/关开关不是很有用;你真的需要一些方法来打开/关闭各个部分。基于分层的日志记录(例如 log4net 或新的 Microsoft.Extensions.Logging)对此很有用,但是手动为不同的程序集/命名空间/主题设置六个单独的 TraceSource 通常是可以的。(如果您深入到类级别,对层次结构的显式支持很有用。)

关键是您需要能够打开/关闭详细日志记录的各个部分,或其他一些过滤方式,以便它有用。(另一种选择是将所有内容写入 Seq 之类的内容,例如使用 Essential.Diagnostics.SeqTraceListener,然后过滤您感兴趣的内容。)

更多详细信息:https ://essentialdiagnostics.codeplex.com/wikipage?title=Logging%20Levels&referringTitle=Guidance

(2) 事件 ID 理论——另一个主要指导是基于早期的 Internet RFC“回复代码理论”;如果您使用过 Web/HTTP,那么您通常会发现 400 和 500 条消息是错误的。我认为拥有托管事件ID,特别是对于信息级别及以上(但不是详细)是一个很好的功能。System.Diagnostics 支持这一点,而我在 Essential.Diagnostics 中拥有的流畅接口使它更容易一些。新的 Microsoft.Extensions.Logging 还包括对事件 ID 的良好支持,但其他框架(log4net、NLog 等)可能有点笨拙。

更多详情:https ://essentialdiagnostics.codeplex.com/wikipage?title=Event%20Ids&referringTitle=Guidance

于 2017-02-10T03:32:11.027 回答