这篇文章给大家分享的是有关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#如何实现跟踪”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
原创文章,作者:3628473679,如若转载,请注明出处:https://blog.ytso.com/201248.html