每个程序都要和日志打交道。程序日志的质量直接影响了排除问题的难度。普通程序调试信息直接输出控制台,复杂程序则通过文本,xml等方式记录运行时的调试信息。
在C#中Diagnostics命名空间下有一个微软提供的专门用于记录信息的TraceSource类。TraceSource的使用方法很简单,只需要4行代码
TraceSource ts = new TraceSource("Code.Main", SourceLevels.All); ts.Listeners.Add(new ConsoleTraceListener()); ts.TraceEvent(TraceEventType.Information, 0, "Message"); ts.Close();
日志类包括以下组成:
- TraceSource: 日志的主体,日志类都是围绕这个类展开的。第一个初始化参数是名字,用于唯一标志TraceSource。可以在一个程序中定义多个TraceSource,通过名字进行区分。第二个初始化参数就是SourceSwitch.
- SourceSwitch: 用于筛选日志。在打日志的时候(调用函数TraceEvent),可以设置输出日志的类型(TraceEventType), 比如 Critical、Error、Warning、Information和Verbose。SourceSwitch根据日志的类型筛选日志,如果设置为SourceLevels.Error,那么只有Error, Critical类型的日志能被输出到Listener.
- Listener: 输出日志的位置。例如ConsoleTraceListener将日志输出到控制台, XmlWriterTraceListener将日志以xml格式输出到文件中。
- TraceFilters: TraceSource可以筛选输出到Listener的日志,同样, Listener也可以筛选输出的日志,这就是TraceFilter的作用.
提示:
- 一个程序可以有多个TraceSource, 一个TraceSource可以设置多个Listener, 不同的TraceSource可以共享一个Listerner(这也就是TraceFilter存在的意义)。如果一个TraceSource设置多个Listener,那么日志会同时输出到所有Listener。
- SourceLevels有两种类型,一种是和重要性相关的日志类型, 比如Critical, Error, Warning, Information,Verbose。 另外一种是和活动相关的日志类型ActivityTracing, 只有TraceEventType.Start, TraceEventType.Suspend, TraceEventType.Transfer, TraceEventType.Resume。 和活动相关的日志类型主要用于记录程序中子线程或者子任务开始,结束的状态。
- TraceEvent的第二个参数是一个整形助记符。在不同的函数中设置不同的助记符或者直接设置为线程id,用来记录线程的运行状态。
- 调用TraceEvent不会直接将日志输出到Listener, 需要调用Flush或者Close才能输出到Listener.
- TraceSource有一个方法TraceTransfer, 是和活动相关的方法。他向Listener写入一条转移信息(其实就是输出一条包含guid的信息),表明一个活动(线程)执行了一个新的子活动(子线程)。可以根据这条信息判断程序的执行流程。这个方法需要配合Trace.CorrelationManager.StartLogicalOperation, Trace.CorrelationManager.StopLogicalOperation使用。
- 微软帮我们实现了常用的Listener, 比如ConsoleTraceListener,TextWriterTraceListener, XmlWriterTraceListener, DelimitedListTraceListener, EventLogTraceListener, EventSchemaTraceListener。如果需要定制Listener, 只需要实现TraceListener接口即可。
- 可以通过App.config动态配置日志类的属性,但程序中设置的属性会覆盖配置文件的属性。
时间: 2024-10-13 23:12:46