2013-03-05 31 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是有意義的,可以嘗試用類似這個的「範圍」類來管理它們。

祝你好運!

相關問題