這篇文章給大家分享的是有關C#如何實現跟蹤的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
一、為什么需要用到跟蹤技術:
利用跟蹤功能可以從正在運行的應用程序(發布后的程序)中查看消息。我們把定義消息(不同級別的消息)的代碼寫在應用程序中,根據配置文件中配置,從而寫入不同級別的消息。這些消息會寫入到哪呢?vs默認是寫入到輸出窗口上的。輸出窗口只能在調試狀態下看的見。當我們跟蹤發布后的程序那怎么辦呢?我們需要在配置文件中定義一個偵聽器,來接受從應用程序中寫入的消息。下面來具體的介紹跟蹤
二、跟蹤體系架構:
①,跟蹤源:跟蹤信息的源頭。例如:需要跟蹤程序集或跟蹤某個命名空間或某個類
②,開關:開關定義了要記錄的信息級別。例如:可以請求錯誤信息或詳細詳細
③,偵聽器:定義了寫入跟蹤消息的位置。
④,篩選器:篩選要記錄的信息級別。例如:開關定義了Information級別,可以用過篩選只記錄Error信息級別
需要引用命名空間:using System.Diagnostics;
三、參數對照表
偵聽器 | 描述 | |
---|---|---|
System.Diagnostics.XmlWriterTraceListener | 寫入Xml文件 | |
System.Diagnostics.TextWriterTraceListener | 寫入文本 | |
System.Diagnostics.DelimitedListTraceListener | 寫入帶有分隔符的文本,配置文件屬性( delimiter=":")設置分隔符號 | |
System.Diagnostics.EventLogTraceListener | 寫入事件日志 | |
WebPageTraceListener | 寫入web跟蹤文件trace.axd中 |
事件 | 描述 |
---|---|
Critical | 定義了致命錯誤或應用程序崩潰 |
Error | 表示可恢復的錯誤 |
Information | 信息性消息 |
Verbose | 調試跟蹤 |
Warning | 非關鍵性問題(警告) |
Transfer | 相關標識的更改 |
Start | 邏輯操作的開始 |
Stop | 邏輯操作的停止 |
Suspand | 邏輯操作的掛起 |
Resume | 邏輯操作的恢復 |
級別 | 描述 |
---|---|
ActivityTracing | 允許 Stop、Start、Suspend、Transfer 和 Resume 事件通過。 |
All | 允許所有事件通過。 |
Critical | 只允許 Critical 事件通過。 |
Error | 允許 Critical 和 Error 事件通過。 |
Information | 允許 Critical、Error、Warning 和 Information 事件通過。 |
Off | 不允許任何事件通過。 |
Verbose | 允許 Critical、Error、Warning、Information 和 Verbose 事件通過。 |
Warning | 允許 Critical、Error 和 Warning 事件通過。 |
參數 | 描述 |
---|---|
Callstack | 寫入調用堆棧 |
DateTime | 寫入日期和時間 |
LogicalOperationStack | 寫入邏輯操作堆棧 |
None | 不寫入如何操作 |
ProcessId | 寫入進程標識 |
ThreadId | 寫入線程標識 |
Timestamp | 寫入時間戳 |
四、配置跟蹤文件:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <system.diagnostics> <!-- ====定義源=== --> <sources><!-- 跟蹤源 開關名稱 開關類型 --> <source name="TraceDome4" switchName="myTraceDome4" switchType ="System.Diagnostics.SourceSwitch"> <listeners> <add name="XmlTraceListener"></add><!--引用偵聽器--> <add name="DelimitedTraceListener"> <!--(源篩選)只顯示TraceInfo程序集的跟蹤--> <!--<filter type="System.Diagnostics.SourceFilter" initializeData="TraceInfo"/>--> <!--(跟蹤事件類型篩選)只寫入事件類型為Error的信息--> <!--<filter type="System.Diagnostics.EventTypeFilter" initializeData="Error"/>--> </add> </listeners> </source> </sources> <!-- ============= --> <!-- ====偵聽器=== --> <sharedListeners><!-- 偵聽器類型 輸出中的跟蹤數據選項 輸出位置--> <add name="XmlTraceListener" type="System.Diagnostics.XmlWriterTraceListener" traceOutputOptions="Callstack,LogicalOperationStack" initializeData="myTraceDome4.xml"></add> <add name="DelimitedTraceListener" type="System.Diagnostics.DelimitedListTraceListener" delimiter=":" traceOutputOptions="DateTime" initializeData="DelimitedTraceListener.txt"></add> </sharedListeners> <!-- ============= --> <!-- ====開關=== --> <switches><!-- 開關名稱 開關級別 --> <add name="myTraceDome4" value="All"/> </switches> <!-- ============= --> <!--在這個問題上一直搞了很長一段時間,原來是這個沒有配置。如果不配置這個,就不會寫入文件--> <!--自動刷新(必須)--> <trace autoflush="true" /> </system.diagnostics> </configuration>
五、在應用程序中寫入消息代碼
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Diagnostics; namespace TraceDome4 { class Program { //跟蹤源 internal static TraceSource trace = new TraceSource("TraceDome4"); static void Main(string[] args) { //邏輯操作的開始 trace.TraceEvent(TraceEventType.Start, 0, "邏輯操作的開始"); //寫入普通消息 trace.TraceInformation("寫入消息"); //寫入錯誤消息,根據TraceEventType枚舉不同的消息級別 trace.TraceEvent(TraceEventType.Error, 0, "錯誤消息"); //邏輯操作的結束 trace.TraceEvent(TraceEventType.Stop, 0, "邏輯操作的結束"); //寫入普通消息 trace.TraceInformation("寫入消息"); } } }
使用服務跟蹤查看器,查看xml
五、在應用程序中寫入消息代碼(相關性)
使用相關性必須給跟蹤數據選項設置Callstack,LogicalOperationStack
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Diagnostics; using System.Threading; namespace TraceDome4 { class Program { //跟蹤源 internal static TraceSource trace = new TraceSource("TraceDome4"); static void Main(string[] args) { //設置一個活動ID Trace.CorrelationManager.ActivityId = Guid.NewGuid(); //邏輯操作的開始 trace.TraceEvent(TraceEventType.Start, 0, "邏輯操作的開始"); //啟用線程上的邏輯操作 Trace.CorrelationManager.StartLogicalOperation("Main Operation"); //寫入普通消息 trace.TraceInformation("寫入消息"); //寫入錯誤消息,根據TraceEventType枚舉不同的消息級別 trace.TraceEvent(TraceEventType.Error, 0, "錯誤消息"); //開啟一個線程 Thread th = new Thread(new ThreadStart(Simple)); th.Start(); //停止線程上的邏輯操作 Trace.CorrelationManager.StopLogicalOperation(); //邏輯操作的結束 trace.TraceEvent(TraceEventType.Stop, 0, "邏輯操作的結束"); } private static void Simple() { //設置一個活動ID Trace.CorrelationManager.ActivityId = Guid.NewGuid(); //啟用線程上的邏輯操作 Trace.CorrelationManager.StartLogicalOperation("Simple Operation"); //寫入警告消息 trace.TraceEvent(TraceEventType.Warning, 0, "警告消息"); //停止線程上的邏輯操作 Trace.CorrelationManager.StopLogicalOperation(); } } }
感謝各位的閱讀!關于“C#如何實現跟蹤”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。