1

我正在使用 System.Diagnostics 中的跟踪功能,并且遇到了各种各样的问题。我已经在我的应用程序中实现了自我跟踪,没有任何问题,但是我正在努力寻找一些最佳实践。或者更简单地说,我理解如何,但不知道为什么。

我有一个 RESTful 客户端/服务器应用程序,其中客户端是 Web 浏览器,服务器不会在其他任何地方进行任何调用(例如,没有 WCF 调用其他服务器进程)。

我试图弄清楚的概念是活动的概念。跟踪在概念上分组在一起,允许您查看特定活动的所有跟踪消息。在单个页面加载期间,我将对各种类进行多次调用,从数据库中获取数据,对数据执行业务逻辑等。

Activity 应该有多细?“页面加载是单个 Activity”或“每个方法调用都是新的子 Activity”的极端情况?或者是中间的东西,也许:'数据访问调用和页面加载的业务逻辑调用都是子活动,其他一切都在主页加载活动之下'?

另一个概念是CorrelationManager.StartLogicalOperation方法的概念。同样,它的实现并不棘手,但要理解为什么要使用它。这似乎允许您在逻辑操作名称下将一组跟踪分组在一起。然而,这里似乎与跟踪活动组的概念有重叠。这两个概念应该一起使用吗?为什么/在什么情况下您会使用其中一种?

4

1 回答 1

0

我认为这些概念(活动和逻辑操作)是正交的。你可以有一个里面有很多 LogicalOperations 的 Activity。或者,您可以有一个 Activity 可以更改的 LogicalOperation。我猜想 Activity 比 LogicalOperation 更高级别会更常见。

我这么说可能不是很有帮助,但是就组织日志记录而言,由您决定什么对您和您的应用程序最有意义。

我怀疑一个请求导致一个活动是很常见的。

您可能会发现帮助类有助于更轻松地管理 Activity 和 LogicalOperation。像这样的东西:

class ActivityScope : IDisposable
{
  Guid oldActivity;
  ActivityScope()
  {
    oldActivity = System.Diagnostics.CorrelationManager.ActivityId;
    System.Diagnostics.CorrelationManager.ActivityId = Guid.NewGuid();
  }

  public void Dispose()
  {
    System.Diagnostics.CorrelationManager.ActivityId = oldActivity;
  }
}

class LogicalOperationScope : IDisposable
{
  public LogicalOperationScope(string logicalOperation)
  {
    System.Diagnostics.CorrelationManager.StartLogicalOperation(logicalOperation);
  }

  public void Dispose()
  {
    System.Diagnostics.CorrelationManager.StopLogicalOperation();
  }
}

你可以像这样使用它们:

void ServiceARequest()
{
  using (new ActivityScope())
  {
    //Do some stuff

    using (new LogicalOperationScope("SomeWork"))
    {
      DoSomeWork();

      for (int i = 0; i < 10; i++)
      {
        using (new LogicalOperationScope(string.Format("nested {0}", i))
        {
          DoNestedWork(i);
        }
      }
    }
  }
}

void DoSomeWork()
{
  using (new LogicalOperationScope("DoSomeWork"))
  {
  }
}

void DoNestedWork(int level)
{
}

显然,我的示例重于诊断代码而轻于实际代码,但您明白了。如果拥有 ActivityId 或 LogicalOperation 对您有意义,请尝试使用与此类似的“范围”类来管理它们。

祝你好运!

于 2013-03-29T20:09:38.760 回答