C#笔记30:Trace、Debug和TraceSource的使用以及日志设计

本章概要:

1:Trace 和 Debug区别

2:什么是Listeners

3:跟踪开关

3.1:使用BooleanSwitch开关

3.2:使用TraceSwitch开关

4:使用TraceSource代替Trace和

5:设计一个日志系统

6:关于EventLog

.NET Framework 命名空间 System.Diagnostics 包含用于跟踪执行流程的 Trace、Debug 和 TraceSource 类,以及用于分析代码的 Process、EventLog 和 PerformanceCounter 类。

跟踪是一种在应用程序运行时监视其执行情况的方式。当开发 .NET Framework 应用程序时,可以在其中添加跟踪和调试检测功能,并且在开发应用程序时和部署应用程序后,都可以使用该检测功能。利用 TraceDebug 类,可以将有关错误和应用程序执行的信息记录到日志、文本文件或其他设备中,以便在随后进行分析。

下面列出了六个写入跟踪信息的 Debug Members 和 Trace 方法。

Assert:指定的文本;如果未指定任何文本,则为“调用堆栈”。只有当 Assert 语句中以参数形式指定的条件为 false 时,才会写入输出。

Fail:指定的文本;如果未指定任何文本,则为“调用堆栈”。

Write:指定的文本。

WriteIf:如果满足 WriteIf 语句中以参数形式指定的条件,则为指定的文本。

WriteLine:指定的文本和一个回车。

WriteLineIf:如果满足 WriteLineIf 语句中以参数形式指定的条件,则为指定的文本和一个回车。

1:Trace 和 Debug区别

      TraceDebug 类基本相同,不同的只是 Trace 类的过程和函数默认为编译成发布版本。

2:什么是Listeners

Listenters属性,它是TraceListenerCollection类型(TraceSource类和TraceListener类),给类属性控制跟踪信息输出的方向,可以是控制台(add(TextWriterTraceListener(new Console.Out))),文件(add(TextWriterTraceListener(new IO.File.CreateText(“output.txt”))等。Listenters集合中的成员包括TextWriterTraceListener,DefaultTraceListener,EventLogTraceListener,WebPageTraceListener等。而TextWriterTraceListener的子类又有ConsoleTraceListener, DelimitedListTraceListener,XmlWriterTraceListener,EventSchemaTraceListener。

您可以通过实现您自己的侦听器来生成自定义的结果。 所有自定义侦听器都应支持文章开头表中的六个方法。

以下的例子说明输出的消息将会在控制台、TXT文件以及系统日志中均被记录。

            TextWriterTraceListener tr1 = new TextWriterTraceListener(System.Console.Out);Debug.Listeners.Add(tr1);TextWriterTraceListener tr2 = new TextWriterTraceListener(System.IO.File.CreateText("output.txt"));Debug.Listeners.Add(tr2);EventLogTraceListener tr3 = new EventLogTraceListener();Debug.Listeners.Add(tr3);

3:跟踪开关

除了指定Listener外,要控制消息是否被输出,还需要指定跟踪开关。跟踪开关用于启用、禁用和筛选跟踪输出。

Framework 中提供了三种类型的跟踪开关:BooleanSwitch 类、TraceSwitch 类和 SourceSwitch 类。BooleanSwitch是最简单的跟踪开关,可以指定是否输出消息。TraceSwitch 和 SourceSwitch 类用于为特定的跟踪级别启用跟踪开关,以便显示为该级别及其下的所有级别指定的 Trace 或 TraceSource 消息。

3.1:使用BooleanSwitch开关

以下是使用BooleanSwitch的例子:

            TextWriterTraceListener tr1 = new TextWriterTraceListener(System.Console.Out);Debug.Listeners.Add(tr1);TextWriterTraceListener tr2 = new TextWriterTraceListener(System.IO.File.CreateText("output.txt"));Debug.Listeners.Add(tr2);EventLogTraceListener tr3 = new EventLogTraceListener();Debug.Listeners.Add(tr3);bool someBizCondition = true;BooleanSwitch bs = new BooleanSwitch("DataMessageSwitch", "DataMessageSwitch des");bs.Enabled = true;Debug.WriteLineIf(someBizCondition, "log....");Debug.Flush();

bs.Enabled设置为true或者false,并不会使程序自动决定是否输出信息。

如果不使用代码方式,而是使用配置文件的方式,是在 <configuration> 标记之后,但在 </configuration> 标记之前添加相应的 XML 来配置您的开关。如下:

<system.diagnostics><switches><add name="DataMessagesSwitch" value="1" /></switches>
</system.diagnostics>
 

3.2:使用TraceSwitch开关

TraceSwitch类可以通过使用跟踪开关来筛选消息,通过Level属性来获取或设置开关级别。0、1、2、3 和 4 分别对应于 OffErrorWarningInfoVerbose。任何大于 4 的数字都会被当作 Verbose,任何小于零的数字都会被当作 Off

以下的例子,用代码的方式来演示使用TraceSwitch来设置跟踪开关:

            TextWriterTraceListener tr1 = new TextWriterTraceListener(System.Console.Out);Debug.Listeners.Add(tr1);TextWriterTraceListener tr2 = new TextWriterTraceListener(System.IO.File.CreateText("output.txt"));Debug.Listeners.Add(tr2);EventLogTraceListener tr3 = new EventLogTraceListener();Debug.Listeners.Add(tr3);bool someBizCondition = true;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!!!");Debug.Flush();

使用XML来配置,如下:

<system.diagnostics><switches><add name="mySwitch" value="1" /></switches>
</system.diagnostics>

4:使用TraceSource代替Trace和Debug

从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

微信扫一扫,关注最课程(www.zuikc.com),获取更多我的文章,获取软件开发每日一练

练习:

1.You are using the Microsoft Visual Studio 2005 IDE to examine the output of a method that returns a string. 
You assign the output of the method to a string variable named fName. You need to write a code segment that
prints the following on a single line     The message. "Test Failed. " The value of fName if the value of fName does 
not equal "John" You also need to ensure that the code segment simultaneously facilitates uninterrupted execution   
of the application. Which code segment should you use?
A. Debug.Assert(fName == "John", "Test FaileD. ", fName);
B. Debug.WriteLineIf(fName != "John", fName, "Test Failed");
C. if (fName != "John") {Debug.Print("Test FaileD. "); Debug.Print(fName);      }
D. if (fName != "John") {Debug.WriteLine("Test FaileD. "); Debug.WriteLine(fName);     }
Answer: B

17.You are testing a newly developed method named PersistToDB. This method accepts a parameter of type 
EventLogEntry. This method does not return a value. You need to create a code segment that helps you to test the   
method. The code segment must read entries from the application log of local computers and then pass the entries
on to the PersistToDB method. The code block must pass only events of type Error or Warning from the source
MySource to the PersistToDB method. Which code segment should you use? 
A. EventLog myLog = new EventLog("Application", ".");       
foreach (EventLogEntry entry in myLog.Entries)   
{if (entry.Source == "MySource") {  PersistToDB(entry);     }  }
B. EventLog myLog = new EventLog("Application", ".");        
myLog.Source = "MySource";     
foreach (EventLogEntry entry in myLog.Entries) {          
if (entry.EntryType == (EventLogEntryType.Error & EventLogEntryType.Warning))   
{ PersistToDB(entry);  }}

C. EventLog myLog = new EventLog("Application", ".");        
foreach (EventLogEntry entry in myLog.Entries)   
{ if (entry.Source == "MySource")  
{if (entry.EntryType == EventLogEntryType.Error || entry.EntryType == EventLogEntryType.Warning) 
  {PersistToDB(entry); }  } }
D. EventLog myLog = new EventLog("Application", ".");       
myLog.Source = "MySource";     
foreach (EventLogEntry entry in myLog.Entries)   
{if (entry.EntryType == EventLogEntryType.Error || entry.EntryType == EventLogEntryType.Warning)   
{PersistToDB(entry); }
Answer: C

C#笔记30:Trace、Debug和TraceSource的使用以及日志设计相关推荐

  1. 【转】 C#学习笔记14——Trace、Debug和TraceSource的使用以及日志设计

    [转] C#学习笔记14--Trace.Debug和TraceSource的使用以及日志设计 Trace.Debug和TraceSource的使用以及日志设计   .NET Framework 命名空 ...

  2. JavaSE笔记 30天学Java打卡 Day06

    JavaSE笔记 30天学Java打卡 Day06 本笔记配套[零基础 快速学Java]韩顺平 零基础30天学会Java 视频一起食用 链接

  3. kettle学习笔记(三)——kettle资源库、运行方式与日志

    kettle学习笔记(三)--kettle资源库.运行方式与日志 一.kettle资源库 资源库是用来保存转换任务的,用户通过图形界面创建的的转换任务可以保存在资源库中. 资源库可以使多用户共享转换任 ...

  4. 30个非常时尚的网页联系表单设计优秀示例

    联系表单是网站最重要的组成部分之一,访客通过联系表单和网站所有者取得联系,反馈信息.新颖的网页表单设计能吸引用户的注意力,让更多的用户填写反馈信息.今天这篇文章和大家分享30个很时尚的网页联系表单设计 ...

  5. web网页设计实例作业 ——中国茶文化(30页) HTML网页制作作品 简单文化网页设计成品 dreamweaver学生网站模板

    web网页设计实例作业 --中国茶文化(30页) HTML网页制作作品 简单文化网页设计成品 dreamweaver学生网站模板 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电商. ...

  6. div+css静态网页设计 web网页设计实例作业 ——中国茶文化(30页) HTML网页制作作品 简单文化网页设计成品 dreamweaver学生网站模板

    web网页设计实例作业 --中国茶文化(30页) HTML网页制作作品 简单文化网页设计成品 dreamweaver学生网站模板 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电商. ...

  7. 期末作业代码网页设计代码——网站商城后台通用模板(30页) 大学生后台模板网页作品商城网页设计作业模板 学生网页制作源代码下载

    HTML5期末大作业:商城后台网站设计--网站商城后台通用模板(30页) 大学生后台模板网页作品商城网页设计作业模板 学生网页制作源代码下载 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅 ...

  8. 关于美食商城HTML网页设计-----在线美食订餐网站html模板源码30个页面(功能齐全) html+css+javascript网页设计实例 企业网站制作...

    关于美食商城HTML网页设计-----在线美食订餐网站html模板源码30个页面(功能齐全) html+css+javascript网页设计实例 企业网站制作 临近期末, 你还在为HTML网页设计结课 ...

  9. kettle将文件路径定义为_kettle学习笔记(三)——kettle资源库、运行方式与日志...

    一.kettle资源库 资源库是用来保存转换任务的,用户通过图形界面创建的的转换任务可以保存在资源库中. 资源库可以使多用户共享转换任务,转换任务在资源库中是以文件夹形式分组管理的,用户可以自定义文件 ...

  10. 问题:在 main 方法中使用 httpclient 时,idea 控制台会疯狂打印 DEBUG org.apache.http.wire 的日志

    问题:在 main 方法中使用 httpclient 时,idea 控制台会疯狂打印 DEBUG org.apache.http.wire 的日志,导致 C:\Users\shuang\AppData ...

最新文章

  1. 对于神经网络,硕博士不需要弄明白原理,只需要应用,是这样吗?
  2. 转:场景管理--BSP
  3. unix下批量进程的创建和强杀命令
  4. 冠赢网络:游戏盾彻底解决DDoS/CC攻击
  5. 怎么在html页面和js里判断是否是IE浏览器
  6. 为什么 Go 的泛型一拖再拖?(转)
  7. Codeforces Technocup 2017 - Elimination Round 2 E Subordinates(贪心)
  8. 微型计算机控制系统常用报警方式,微型计算机控制技术复习资料.docx
  9. 【LeetCode】【字符串】题号:*12. 整数转罗马数字
  10. php中的转义字符(用反斜杠\来输出,和C语言一样)
  11. 深度学习优化算法大全系列5:AdaDelta,RMSProp
  12. javascript代码_认识 JavaScript 可执行代码
  13. FAL风控策略分析师怎么样?
  14. qiankun加载react子应用报错[import-html-entry] error occurs while executing normal script
  15. 666,这个Python库逆天了,居然能把图片、视频无损清晰放大!
  16. n维随机变量的分布函数和独立性
  17. 意外收获:如何将中文转成拼音
  18. 什么是索引,索引的优缺点
  19. CAD图纸转换成高质量的PDF文件,两种方法一步搞定哦
  20. 常用符号的Unicode表

热门文章

  1. JS获取DropDownList的value值与text值
  2. 在idea或eclipse软件下配置Tomcat
  3. 【HANA系列】SAP HANA中null变成问号的问题
  4. chromedriver下载链接以及对应版本
  5. git最简单直接粗爆与github教程
  6. 数据结构-第10周作业(二叉树的创建和遍历算法)
  7. GoogleCpp风格指南 8)格式 _part1
  8. Mysql Fabric实现学习笔记
  9. USB Device Desctiptor 相关
  10. [转]怎么查看端口占用情况?