2013-03-05 35 views
1

我使用在System.Diagnostics程序的跟踪功能时,并创下了各种各样的问题。我在自己的应用程序中实施了跟踪,没有任何问题,但我正在努力应对一些最佳实践。或者更简单地说,我明白如何,但不是为什么。的粒度范围的活动跟踪使用System.Diagnostics程序的服务器端

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

我试图得到正确的概念是一个活动的概念。曲线在概念上被组合在一起,允许您查看特定活动的所有曲线消息。在一个单一的页面加载,我将做一个号码的呼叫各种班,从数据库中获取数据,对数据执行业务逻辑等

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

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

回答

0

我认为这些概念(Activity和LogicalOperation)是正交的。你可以有一个有很多LogicalOperations的Activity。或者,您可以在活动可能发生变化的地方使用LogicalOperation。我猜想活动比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是有意义的,可以尝试用类似这个的“范围”类来管理它们。

祝你好运!

相关问题