Trace、Debug和TraceSource的使用以及日志设计
本章概要:
1:Trace 和 Debug区别
2:什么是Listeners
3:跟踪开关
3.1:使用BooleanSwitch开关
.NET Framework 命名空间 System.Diagnostics 包含用于跟踪执行流程的 Trace、Debug 和 TraceSource 类,以及用于分析代码的 Process、EventLog 和PerformanceCounter 类。
下面列出了六个写入跟踪信息的 Debug Members 和 Trace 方法。
Assert:指定的文本;如果未指定任何文本,则为"调用堆栈"。只有当 Assert 语句中以参数形式指定的条件为 false 时,才会写入输出。
Fail:指定的文本;如果未指定任何文本,则为"调用堆栈"。
WriteIf:如果满足 WriteIf 语句中以参数形式指定的条件,则为指定的文本。
WriteLineIf:如果满足 WriteLineIf 语句中以参数形式指定的条件,则为指定的文本和一个回车。
Trace 和 Debug 类基本相同,不同的只是 Trace 类的过程和函数默认为编译成发布版本。
您可以通过实现您自己的侦听器来生成自定义的结果。 所有自定义侦听器都应支持文章开头表中的六个方法。
以下的例子说明输出的消息将会在控制台、TXT文件以及系统日志中均被记录。
TextWriterTraceListener tr1 = new TextWriterTraceListener(System.Console.Out);
TextWriterTraceListener tr2 = new TextWriterTraceListener(System.IO.File.CreateText("output.txt"));
EventLogTraceListener tr3 = new EventLogTraceListener();
除了指定Listener外,要控制消息是否被输出,还需要指定跟踪开关。跟踪开关用于启用、禁用和筛选跟踪输出。
Framework 中提供了三种类型的跟踪开关:BooleanSwitch 类、TraceSwitch 类和 SourceSwitch 类。BooleanSwitch是最简单的跟踪开关,可以指定是否输出消息。TraceSwitch 和 SourceSwitch 类用于为特定的跟踪级别启用跟踪开关,以便显示为该级别及其下的所有级别指定的 Trace 或 TraceSource 消息。
3.1:使用BooleanSwitch开关
TextWriterTraceListener tr1 = new TextWriterTraceListener(System.Console.Out);
TextWriterTraceListener tr2 = new TextWriterTraceListener(System.IO.File.CreateText("output.txt"));
EventLogTraceListener tr3 = new EventLogTraceListener();
BooleanSwitch bs = new BooleanSwitch("DataMessageSwitch", "DataMessageSwitch des");
Debug.WriteLineIf(someBizCondition, "log....");
bs.Enabled设置为true或者false,并不会使程序自动决定是否输出信息。
如果不使用代码方式,而是使用配置文件的方式,是在 <configuration> 标记之后,但在 </configuration> 标记之前添加相应的 XML 来配置您的开关。如下:
<add name="DataMessagesSwitch" value="1" />
以下的例子,用代码的方式来演示使用TraceSwitch来设置跟踪开关:
TextWriterTraceListener tr1 = new TextWriterTraceListener(System.Console.Out);
TextWriterTraceListener tr2 = new TextWriterTraceListener(System.IO.File.CreateText("output.txt"));
EventLogTraceListener tr3 = new EventLogTraceListener();
TraceSwitch ts = new TraceSwitch("mySwitch", "in the Config file");
ts.Level = TraceLevel.Verbose;
Debug.WriteLineIf(ts.TraceError && someBizCondition, "Error!!!");
Debug.WriteLineIf(ts.TraceWarning && someBizCondition, "Warning!!!");
Debug.WriteLineIf(ts.TraceInfo && someBizCondition, "Info!!!");
Debug.WriteLineIf(ts.TraceVerbose && someBizCondition, "Verbose!!!");
<add name="mySwitch" value="1" />
从FRAMEWORK2.0开始,就不建议使用Trace和Debug了,而改而用TraceSouce。TraceSource 旨在用作增强的跟踪系统,并且可代替较旧的 Trace 和 Debug跟踪类的静态方法使用。熟悉的 Trace 和 Debug 类仍然存在,不过建议的做法是使用 TraceSource 类进行跟踪。
下面的例子演示使用代码来实现消息的输出:
private static TraceSource mySource = new TraceSource("TraceSourceApp");
static void Main(string[] args)
{
mySource.Switch = new SourceSwitch("sourceSwitch", "Error");
mySource.Listeners.Remove("Default");
TextWriterTraceListener textListener = new TextWriterTraceListener("myListener.log");
textListener.TraceOutputOptions = TraceOptions.DateTime | TraceOptions.Callstack;
textListener.Filter = new EventTypeFilter(SourceLevels.Error);
mySource.Listeners.Add(textListener);
ConsoleTraceListener console = new ConsoleTraceListener(false);
console.Filter = new EventTypeFilter(SourceLevels.Information);
console.Name = "console";
mySource.Listeners.Add(console);
Activity1();
// Set the filter settings for the
// console trace listener.
mySource.Listeners["console"].Filter = new EventTypeFilter(SourceLevels.Critical);
Activity2();
// Allow the trace source to send messages to
// listeners for all event types.
mySource.Switch.Level = SourceLevels.All;
// Change the filter settings for the console trace listener.
mySource.Listeners["console"].Filter = new EventTypeFilter(SourceLevels.Information);
Activity3();
mySource.Close();
return;
}
static void Activity1()
{
mySource.TraceEvent(TraceEventType.Error, 1, "Error message.");
mySource.TraceEvent(TraceEventType.Warning, 2, "Warning message.");
}
static void Activity2()
{
mySource.TraceEvent(TraceEventType.Critical, 3, "Critical message.");
mySource.TraceInformation("Informational message.");
}
static void Activity3()
{
mySource.TraceEvent(TraceEventType.Error, 4, "Error message.");
mySource.TraceInformation("Informational message.");
}
以上代码,如果使用配置文件的方式实现,如下:
<system.diagnostics>
<sources>
<source name="TraceSourceApp" switchName="sourceSwitch" switchType="System.Diagnostics.SourceSwitch">
<listeners>
<add name="console" type="System.Diagnostics.ConsoleTraceListener">
<filter type="System.Diagnostics.EventTypeFilter" initializeData="Warning"/>
</add>
<add name="myListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="myListener.log"
traceOutputOptions="Callstack">
<filter type="System.Diagnostics.EventTypeFilter" initializeData="Error"></filter>
</add>
<remove name="Default"/>
</listeners>
</source>
</sources>
<switches>
<add name="sourceSwitch" value="Warning"/>
</switches>
</system.diagnostics>
配置文件实现的对应代码部分为:
private static TraceSource mySource = new TraceSource("TraceSourceApp");
static void Main(string[] args)
{
Activity1();
Activity2();
Activity3();
mySource.Close();
return;
}
static void Activity1()
{
mySource.TraceEvent(TraceEventType.Error, 1, "Error message.");
mySource.TraceEvent(TraceEventType.Warning, 2, "Warning message.");
}
static void Activity2()
{
mySource.TraceEvent(TraceEventType.Critical, 3, "Critical message.");
mySource.TraceInformation("Informational message.");
}
static void Activity3()
{
mySource.TraceEvent(TraceEventType.Error, 4, "Error message.");
mySource.TraceInformation("Informational message.");
}
5:设计一个日志系统
有了以上的知识之后,我们就可以来设计一个应用程序的日志系统(是的,我们不在需要LOG4NET)。我们来假设这个日志系统最基础的功能:
1、以日期来创建日志名,以免历史日志全部写入一个文件中去;
2、可以配置想要输出的日志类别,如Warning或者Error等;
3、可以配置想要的日志内容:如StackTrace或者错误信息等;
思路:
1、在应用程序启动代码中,设置文件名。因为文件名要根据日期动态生成,所以不能使用配置文件;
2、其它配置可以配置文件实现;
3、DO IT;
6:关于EventLog
关于EventLog是一个我不喜欢的功能,更多内容,可参考:http://msdn.microsoft.com/zh-cn/library/aaaxk5bx(VS.80).aspx
TraceSource 类的 Switch 属性为 SourceSwitch 对象。SourceSwitch 类提供了用于测试开关的事件级别的 Level 属性。Level 属性获取或设置该开关的 TraceLevel 值。
可以通过应用程序配置文件设置 SourceSwitch 的事件级别,然后在应用程序中使用配置的 SourceSwitch 级别。或者,还可以在代码中创建一个SourceSwitch 并直接设置级别,从而检测特定的代码段。
若要配置 SourceSwitch,请编辑与应用程序名称相对应的配置文件。在此文件中,可以设置开关的值,也可以清除应用程序先前设置的所有开关。应按照下面的示例所示对配置文件的格式进行设置:
此类型的任何公共 static(在 Visual Basic 中为 Shared) 成员都是线程安全的。但不保证所有实例成员都是线程安全的
https://msdn.microsoft.com/en-us/system.diagnostics.tracesource

浙公网安备 33010602011771号