如果一個應用程序將其所有活動數據寫入一個日誌文件,是否有使用多個TraceSource的用處?我只是對代碼中需要多個TraceSource的用例感到好奇。什麼時候需要在代碼中使用多個TraceSource?
回答
看到這些答案的一個很好的起點等問題,使用TraceSources上:
can't understand .net 2010 tracing and app.config
How to use TraceSource across classes
我要說的是,任何時候你有一個以上的類,你可能(可能)考慮有多個TraceSource。
一個優點於具有多個TraceSource是,它增加了在這你可以控制你的日誌的粒度。例如,如果您在每個課程中使用不同的TraceSource,則可以將日誌記錄控制到課程級別。你可以打開一個(或多個)特定的類並關閉所有其他類。
這是NLog和log4net用戶的常見模式。使用這些登錄平臺類典型的初始化將是這個樣子:
public class A
{
//NLog example
private static Logger logger = LogManager.GetCurrentClassLogger();
public F()
{
logger.Info("Inside F");
}
}
在這個例子中,A類記錄器被命名爲類的完全限定域名(NLOG確實在GetCurrentClassLogger的辛勤工作() )。
做TraceSource類似的東西,你會做這樣的事情:
public class A
{
private static TraceSource ts = new TraceSource(System.Reflection.GetCurrentMethod().DeclaringType.ToString();
public F()
{
ts.Information("Inside F");
}
}
如果你在每一個類這樣做,你可以很容易地控制你的類記錄。
我不敢肯定這種模式爲常見的有TraceSource因爲它與log4net的和NLOG。我認爲您可能會經常看到TraceSource的用戶按功能區域獲取他們的TraceSources。
所以,你可能將您的應用程序成「讀」,「過程」和「寫」功能(或任何有意義的你)。在這種情況下,你可以得到基於功能區的類別相應的TraceSource它們被用於:
public class FileReader
{
private static TraceSource ts = new TraceSource("Read");
public F()
{
ts.Information("Hello from FileReader.F");
}
}
public class NetworkReader
{
private static TraceSource ts = new TraceSource("Read");
public F()
{
ts.Information("Hello from NetworkReader.F");
}
}
等。
現在,你可以把日誌記錄爲「讀取」,並關閉所有其他職能部門(或打開詳細日誌記錄爲「讀取」,對於所有其他不太詳細的日誌記錄)。
此外,一個與TraceListeners選項是輸出TraceSource名稱。因此,在輸出中,您可以更輕鬆地理解日誌記錄,因爲如果您願意,可以相對輕鬆地找到從特定功能區域(或特定TraceSource)生成的所有日誌記錄消息。
如果你有一個很好的命名空間命名約定,你甚至可以考慮基於命名空間層次結構中的某個節點或甚至基於該類所在的程序集來獲取每個類的TraceSource。類型將爲您檢索該信息。
既然你正在尋找TraceSources,我會鼓勵你看看這個項目在CodePlex上:
http://ukadcdiagnostics.codeplex.com/
這是一個很好的項目(基於TraceSource),它允許您格式化的日誌輸出與使用log4net和NLog所做的相似。
我也鼓勵你看看圍繞着Castle的TraceSource構建的這個日誌記錄封裝器。
https://github.com/castleproject/Castle.Core/blob/master/src/Castle.Core/Core/Logging/TraceLogger.cs
有趣的事情,他們所做的是提供一個層次結構TraceSource的名稱。過去我已經實現了類似的東西。它工作得很好。
我對這個問題的答案提供了TraceSource層次如何是有益的想法:
What's the best approach to logging?
祝你好運!
- 1. 什麼時候使用GWT,什麼時候不需要
- 2. Application.DoEvents,什麼時候需要,什麼時候不需要?
- 3. 我什麼時候需要使用@WebServiceRef?
- 4. 什麼時候需要使用ng-template?
- 5. 我什麼時候需要使用MPI_Barrier()?
- 6. 我什麼時候需要使用「android:id」?
- 7. 你什麼時候需要在Ruby中需要一個模塊?
- 8. 什麼時候需要CAMLparamX?
- 9. 什麼時候需要pygame.init()?
- 10. 什麼時候需要NSCopying?
- 11. 什麼時候需要NS_RETURNS_RETAINED?
- 12. 什麼時候需要「javascript:...」?
- 13. 什麼時候需要TransactionScopeOption.Supress?
- 14. 什麼時候需要dynamic_cast?
- 15. 什麼時候需要curl_global_init()?
- 16. 什麼時候在C++中需要'int'?
- 17. 什麼時候使用Cache要多少?
- 18. 什麼時候需要(「哪個」)出生?
- 19. 我什麼時候需要使用的各個jQuery中
- 20. Android上的OpenCV,我什麼時候需要本地代碼?
- 21. 我什麼時候需要分配財產,什麼時候不需要?
- 22. 什麼時候需要在java中初始化一個對象,什麼時候不需要?
- 23. 我什麼時候需要調用XInitThreads?
- 24. 什麼時候需要引用document.getElementByID?
- 25. 什麼時候js中的「var」需要?
- 26. 我什麼時候需要在Jasmine的beforeEach塊中使用?
- 27. 我什麼時候需要在Backbone.js中使用_.bindAll()?
- 28. 什麼時候需要在angular2中使用jQuery?
- 29. 什麼時候需要在python中使用全局關鍵字
- 30. 我們什麼時候需要在codeIgniter中使用base_url()函數?