使用system.diagnostics服务器端进行跟踪时的活动范围的粒度

时间:2013-03-05 15:47:16

标签: c# .net trace system.diagnostics

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

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

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

活动的粒度应该是多少? “页面加载是单个活动”还是“每个方法调用是一个新的子活动”的极端情况?或者是中间的东西,可能是:'数据访问调用,页面加载时的业务逻辑调用都是子活动,而其他所有内容都在主页加载活动'下?

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

1 个答案:

答案 0 :(得分:0)

我认为这些概念(Activity和LogicalOperation)是正交的。您可以拥有一个内部有许多LogicalOperations的Activity。或者,您可以使用LogicalOperation,其中Activity可以更改。我猜这个活动的级别比LogicalOperation更高。

这样说可能对我没有多大帮助,但是在你组织日志记录的过程中,由你决定对你和你的应用程序最有意义的事情。

我怀疑在单个Activity中有一个请求结果是很常见的。

您可能会发现使用帮助程序类可以更轻松地管理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是有意义的,请尝试使用与此类似的“范围”类来管理它们。

祝你好运!