C#笔记30:Trace、Debug和TraceSource的使用以及日志设计
2010-10-26 11:28
399 查看
C#笔记30:Trace、Debug和TraceSource的使用以及日志设计
本章概要:
1:Trace和Debug区别
2:什么是Listeners
3:跟踪开关
3.1:使用BooleanSwitch开关
3.2:使用TraceSwitch开关
4:使用TraceSource代替Trace和
5:设计一个日志系统
6:关于EventLog
.NETFramework命名空间System.Diagnostics包含用于跟踪执行流程的Trace、Debug和TraceSource类,以及用于分析代码的Process、EventLog和PerformanceCounter类。
跟踪是一种在应用程序运行时监视其执行情况的方式。当开发.NETFramework应用程序时,可以在其中添加跟踪和调试检测功能,并且在开发应用程序时和部署应用程序后,都可以使用该检测功能。利用Trace和Debug类,可以将有关错误和应用程序执行的信息记录到日志、文本文件或其他设备中,以便在随后进行分析。
下面列出了六个写入跟踪信息的DebugMembers和Trace方法。
Assert:指定的文本;如果未指定任何文本,则为“调用堆栈”。只有当Assert语句中以参数形式指定的条件为false时,才会写入输出。
Fail:指定的文本;如果未指定任何文本,则为“调用堆栈”。
Write:指定的文本。
WriteIf:如果满足WriteIf语句中以参数形式指定的条件,则为指定的文本。
WriteLine:指定的文本和一个回车。
WriteLineIf:如果满足WriteLineIf语句中以参数形式指定的条件,则为指定的文本和一个回车。
您可以通过实现您自己的侦听器来生成自定义的结果。所有自定义侦听器都应支持文章开头表中的六个方法。
以下的例子说明输出的消息将会在控制台、TXT文件以及系统日志中均被记录。
Framework中提供了三种类型的跟踪开关:BooleanSwitch类、TraceSwitch类和SourceSwitch类。BooleanSwitch是最简单的跟踪开关,可以指定是否输出消息。TraceSwitch和SourceSwitch类用于为特定的跟踪级别启用跟踪开关,以便显示为该级别及其下的所有级别指定的Trace或TraceSource消息。
3.1:使用
以下是使用BooleanSwitch的例子:
bs.Enabled设置为true或者false,并不会使程序自动决定是否输出信息。
如果不使用代码方式,而是使用配置文件的方式,是在<configuration>标记之后,但在</configuration>标记之前添加相应的XML来配置您的开关。如下:
3.2:使用
TraceSwitch类可以通过使用跟踪开关来筛选消息,通过Level属性来获取或设置开关级别。0、1、2、3和4分别对应于Off、Error、Warning、Info和Verbose。任何大于4的数字都会被当作Verbose,任何小于零的数字都会被当作Off。
以下的例子,用代码的方式来演示使用TraceSwitch来设置跟踪开关:
使用XML来配置,如下:
TraceSource旨在用作增强的跟踪系统,并且可代替较旧的Trace和Debug跟踪类的静态方法使用。熟悉的Trace和Debug类仍然存在,不过建议的做法是使用TraceSource类进行跟踪。
下面的例子演示使用代码来实现消息的输出:
以上代码,如果使用配置文件的方式实现,如下:
配置文件实现的对应代码部分为:
1、以日期来创建日志名,以免历史日志全部写入一个文件中去;
2、可以配置想要输出的日志类别,如Warning或者Error等;
3、可以配置想要的日志内容:如StackTrace或者错误信息等;
思路:
1、在应用程序启动代码中,设置文件名。因为文件名要根据日期动态生成,所以不能使用配置文件;
2、其它配置可以配置文件实现;
3、DOIT;
http://msdn.microsoft.com/zh-cn/library/aaaxk5bx(VS.80).aspx
微信扫一扫,关注最课程(www.zuikc.com),获取更多我的文章,获取软件开发每日一练
练习:
1.YouareusingtheMicrosoftVisualStudio2005IDEtoexaminetheoutputofamethodthatreturnsastring.
YouassigntheoutputofthemethodtoastringvariablenamedfName.Youneedtowriteacodesegmentthat
printsthefollowingonasinglelineThemessage."TestFailed."ThevalueoffNameifthevalueoffNamedoes
notequal"John"Youalsoneedtoensurethatthecodesegmentsimultaneouslyfacilitatesuninterruptedexecution
oftheapplication.Whichcodesegmentshouldyouuse?
A.Debug.Assert(fName=="John","TestFaileD.",fName);
B.Debug.WriteLineIf(fName!="John",fName,"TestFailed");
C.if(fName!="John"){Debug.Print("TestFaileD.");Debug.Print(fName);}
D.if(fName!="John"){Debug.WriteLine("TestFaileD.");Debug.WriteLine(fName);}
Answer:B
17.YouaretestinganewlydevelopedmethodnamedPersistToDB.Thismethodacceptsaparameteroftype
EventLogEntry.Thismethoddoesnotreturnavalue.Youneedtocreateacodesegmentthathelpsyoutotestthe
method.Thecodesegmentmustreadentriesfromtheapplicationlogoflocalcomputersandthenpasstheentries
ontothePersistToDBmethod.ThecodeblockmustpassonlyeventsoftypeErrororWarningfromthesource
MySourcetothePersistToDBmethod.Whichcodesegmentshouldyouuse?
A.EventLogmyLog=newEventLog("Application",".");
foreach(EventLogEntryentryinmyLog.Entries)
{if(entry.Source=="MySource"){PersistToDB(entry);}}
B.EventLogmyLog=newEventLog("Application",".");
myLog.Source="MySource";
foreach(EventLogEntryentryinmyLog.Entries){
if(entry.EntryType==(EventLogEntryType.Error&EventLogEntryType.Warning))
{PersistToDB(entry);}}
C.EventLogmyLog=newEventLog("Application",".");
foreach(EventLogEntryentryinmyLog.Entries)
{if(entry.Source=="MySource")
{if(entry.EntryType==EventLogEntryType.Error||entry.EntryType==EventLogEntryType.Warning)
{PersistToDB(entry);}}}
D.EventLogmyLog=newEventLog("Application",".");
myLog.Source="MySource";
foreach(EventLogEntryentryinmyLog.Entries)
{if(entry.EntryType==EventLogEntryType.Error||entry.EntryType==EventLogEntryType.Warning)
{PersistToDB(entry);}
Answer:C
本章概要:
1:Trace和Debug区别
2:什么是Listeners
3:跟踪开关
3.1:使用
3.2:使用
4:使用TraceSource代替Trace和
5:设计一个日志系统
6:关于EventLog
.NETFramework命名空间
跟踪是一种在应用程序运行时监视其执行情况的方式。当开发.NETFramework应用程序时,可以在其中添加跟踪和调试检测功能,并且在开发应用程序时和部署应用程序后,都可以使用该检测功能。利用Trace和Debug类,可以将有关错误和应用程序执行的信息记录到日志、文本文件或其他设备中,以便在随后进行分析。
下面列出了六个写入跟踪信息的DebugMembers和Trace方法。
Assert:指定的文本;如果未指定任何文本,则为“调用堆栈”。只有当Assert语句中以参数形式指定的条件为false时,才会写入输出。
Fail:指定的文本;如果未指定任何文本,则为“调用堆栈”。
Write:指定的文本。
WriteIf:如果满足WriteIf语句中以参数形式指定的条件,则为指定的文本。
WriteLine:指定的文本和一个回车。
WriteLineIf:如果满足WriteLineIf语句中以参数形式指定的条件,则为指定的文本和一个回车。
1:Trace和Debug区别
Trace和Debug类基本相同,不同的只是Trace类的过程和函数默认为编译成发布版本。2:什么是Listeners
Listenters属性,它是TraceListenerCollection类型(TraceSource类和TraceListener类),给类属性控制跟踪信息输出的方向,可以是控制台(add(TextWriterTraceListener(newConsole.Out))),文件(add(TextWriterTraceListener(newIO.File.CreateText(“output.txt”))等。Listenters集合中的成员包括TextWriterTraceListener,DefaultTraceListener,EventLogTraceListener,WebPageTraceListener等。而TextWriterTraceListener的子类又有ConsoleTraceListener,DelimitedListTraceListener,XmlWriterTraceListener,EventSchemaTraceListener。您可以通过实现您自己的侦听器来生成自定义的结果。所有自定义侦听器都应支持文章开头表中的六个方法。
以下的例子说明输出的消息将会在控制台、TXT文件以及系统日志中均被记录。
TextWriterTraceListenertr1=newTextWriterTraceListener(System.Console.Out); Debug.Listeners.Add(tr1); TextWriterTraceListenertr2=newTextWriterTraceListener(System.IO.File.CreateText("output.txt")); Debug.Listeners.Add(tr2); EventLogTraceListenertr3=newEventLogTraceListener(); Debug.Listeners.Add(tr3);
3:跟踪开关
除了指定Listener外,要控制消息是否被输出,还需要指定跟踪开关。跟踪开关用于启用、禁用和筛选跟踪输出。Framework中提供了三种类型的跟踪开关:
3.1:使用BooleanSwitch开关
以下是使用TextWriterTraceListenertr1=newTextWriterTraceListener(System.Console.Out); Debug.Listeners.Add(tr1); TextWriterTraceListenertr2=newTextWriterTraceListener(System.IO.File.CreateText("output.txt")); Debug.Listeners.Add(tr2); EventLogTraceListenertr3=newEventLogTraceListener(); Debug.Listeners.Add(tr3);
boolsomeBizCondition=true;
BooleanSwitchbs=newBooleanSwitch("DataMessageSwitch","DataMessageSwitchdes");
bs.Enabled=true;
Debug.WriteLineIf(someBizCondition,"log....");
Debug.Flush();
bs.Enabled设置为true或者false,并不会使程序自动决定是否输出信息。
如果不使用代码方式,而是使用配置文件的方式,是在<configuration>标记之后,但在</configuration>标记之前添加相应的XML来配置您的开关。如下:
<system.diagnostics> <switches> <addname="DataMessagesSwitch"value="1"/> </switches> </system.diagnostics>
3.2:使用TraceSwitch开关
TraceSwitch类可以通过使用跟踪开关来筛选消息,通过Level属性来获取或设置开关级别。0、1、2、3和4分别对应于Off、Error、Warning、Info和Verbose。任何大于4的数字都会被当作Verbose,任何小于零的数字都会被当作Off。以下的例子,用代码的方式来演示使用
TextWriterTraceListenertr1=newTextWriterTraceListener(System.Console.Out); Debug.Listeners.Add(tr1); TextWriterTraceListenertr2=newTextWriterTraceListener(System.IO.File.CreateText("output.txt")); Debug.Listeners.Add(tr2); EventLogTraceListenertr3=newEventLogTraceListener(); Debug.Listeners.Add(tr3);
boolsomeBizCondition=true;
TraceSwitchts=newTraceSwitch("mySwitch","intheConfigfile");
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>
<addname="mySwitch"value="1"/>
</switches>
</system.diagnostics>
4:使用TraceSource代替Trace和Debug
从FRAMEWORK2.0开始,就不建议使用Trace和Debug了,而改而用TraceSouce。下面的例子演示使用代码来实现消息的输出:
privatestaticTraceSourcemySource=newTraceSource("TraceSourceApp");
staticvoidMain(string[]args)
{
mySource.Switch=newSourceSwitch("sourceSwitch","Error");
mySource.Listeners.Remove("Default");
TextWriterTraceListenertextListener=newTextWriterTraceListener("myListener.log");
textListener.TraceOutputOptions=TraceOptions.DateTime|TraceOptions.Callstack;
textListener.Filter=newEventTypeFilter(SourceLevels.Error);
mySource.Listeners.Add(textListener);
ConsoleTraceListenerconsole=newConsoleTraceListener(false);
console.Filter=newEventTypeFilter(SourceLevels.Information);
console.Name="console";
mySource.Listeners.Add(console);
Activity1();
//Setthefiltersettingsforthe
//consoletracelistener.
mySource.Listeners["console"].Filter=newEventTypeFilter(SourceLevels.Critical);
Activity2();
//Allowthetracesourcetosendmessagesto
//listenersforalleventtypes.
mySource.Switch.Level=SourceLevels.All;
//Changethefiltersettingsfortheconsoletracelistener.
mySource.Listeners["console"].Filter=newEventTypeFilter(SourceLevels.Information);
Activity3();
mySource.Close();
return;
}
staticvoidActivity1()
{
mySource.TraceEvent(TraceEventType.Error,1,"Errormessage.");
mySource.TraceEvent(TraceEventType.Warning,2,"Warningmessage.");
}
staticvoidActivity2()
{
mySource.TraceEvent(TraceEventType.Critical,3,"Criticalmessage.");
mySource.TraceInformation("Informationalmessage.");
}
staticvoidActivity3()
{
mySource.TraceEvent(TraceEventType.Error,4,"Errormessage.");
mySource.TraceInformation("Informationalmessage.");
}
以上代码,如果使用配置文件的方式实现,如下:
<system.diagnostics>
<sources>
<sourcename="TraceSourceApp"switchName="sourceSwitch"switchType="System.Diagnostics.SourceSwitch">
<listeners>
<addname="console"type="System.Diagnostics.ConsoleTraceListener">
<filtertype="System.Diagnostics.EventTypeFilter"initializeData="Warning"/>
</add>
<addname="myListener"type="System.Diagnostics.TextWriterTraceListener"initializeData="myListener.log"
traceOutputOptions="Callstack">
<filtertype="System.Diagnostics.EventTypeFilter"initializeData="Error"></filter>
</add>
<removename="Default"/>
</listeners>
</source>
</sources>
<switches>
<addname="sourceSwitch"value="Warning"/>
</switches>
</system.diagnostics>
配置文件实现的对应代码部分为:
privatestaticTraceSourcemySource=newTraceSource("TraceSourceApp");
staticvoidMain(string[]args)
{
Activity1();
Activity2();
Activity3();
mySource.Close();
return;
}
staticvoidActivity1()
{
mySource.TraceEvent(TraceEventType.Error,1,"Errormessage.");
mySource.TraceEvent(TraceEventType.Warning,2,"Warningmessage.");
}
staticvoidActivity2()
{
mySource.TraceEvent(TraceEventType.Critical,3,"Criticalmessage.");
mySource.TraceInformation("Informationalmessage.");
}
staticvoidActivity3()
{
mySource.TraceEvent(TraceEventType.Error,4,"Errormessage.");
mySource.TraceInformation("Informationalmessage.");
}
5:设计一个日志系统
有了以上的知识之后,我们就可以来设计一个应用程序的日志系统(是的,我们不在需要LOG4NET)。我们来假设这个日志系统最基础的功能:1、以日期来创建日志名,以免历史日志全部写入一个文件中去;
2、可以配置想要输出的日志类别,如Warning或者Error等;
3、可以配置想要的日志内容:如StackTrace或者错误信息等;
思路:
1、在应用程序启动代码中,设置文件名。因为文件名要根据日期动态生成,所以不能使用配置文件;
2、其它配置可以配置文件实现;
3、DOIT;
6:关于EventLog
关于EventLog是一个我不喜欢的功能,更多内容,可参考:微信扫一扫,关注最课程(
练习:
1.YouareusingtheMicrosoftVisualStudio2005IDEtoexaminetheoutputofamethodthatreturnsastring.
YouassigntheoutputofthemethodtoastringvariablenamedfName.Youneedtowriteacodesegmentthat
printsthefollowingonasinglelineThemessage."TestFailed."ThevalueoffNameifthevalueoffNamedoes
notequal"John"Youalsoneedtoensurethatthecodesegmentsimultaneouslyfacilitatesuninterruptedexecution
oftheapplication.Whichcodesegmentshouldyouuse?
A.Debug.Assert(fName=="John","TestFaileD.",fName);
B.Debug.WriteLineIf(fName!="John",fName,"TestFailed");
C.if(fName!="John"){Debug.Print("TestFaileD.");Debug.Print(fName);}
D.if(fName!="John"){Debug.WriteLine("TestFaileD.");Debug.WriteLine(fName);}
Answer:B
17.YouaretestinganewlydevelopedmethodnamedPersistToDB.Thismethodacceptsaparameteroftype
EventLogEntry.Thismethoddoesnotreturnavalue.Youneedtocreateacodesegmentthathelpsyoutotestthe
method.Thecodesegmentmustreadentriesfromtheapplicationlogoflocalcomputersandthenpasstheentries
ontothePersistToDBmethod.ThecodeblockmustpassonlyeventsoftypeErrororWarningfromthesource
MySourcetothePersistToDBmethod.Whichcodesegmentshouldyouuse?
A.EventLogmyLog=newEventLog("Application",".");
foreach(EventLogEntryentryinmyLog.Entries)
{if(entry.Source=="MySource"){PersistToDB(entry);}}
B.EventLogmyLog=newEventLog("Application",".");
myLog.Source="MySource";
foreach(EventLogEntryentryinmyLog.Entries){
if(entry.EntryType==(EventLogEntryType.Error&EventLogEntryType.Warning))
{PersistToDB(entry);}}
C.EventLogmyLog=newEventLog("Application",".");
foreach(EventLogEntryentryinmyLog.Entries)
{if(entry.Source=="MySource")
{if(entry.EntryType==EventLogEntryType.Error||entry.EntryType==EventLogEntryType.Warning)
{PersistToDB(entry);}}}
D.EventLogmyLog=newEventLog("Application",".");
myLog.Source="MySource";
foreach(EventLogEntryentryinmyLog.Entries)
{if(entry.EntryType==EventLogEntryType.Error||entry.EntryType==EventLogEntryType.Warning)
{PersistToDB(entry);}
Answer:C
相关文章推荐
- C#学习笔记14——Trace、Debug和TraceSource的使用以及日志设计
- Trace、Debug和TraceSource的使用以及日志设计 .
- Trace、Debug和TraceSource的使用以及日志设计
- Trace、Debug和TraceSource的使用以及日志设计
- Trace、Debug和TraceSource的使用以及日志设计
- Trace、Debug和TraceSource与调试及日志设计
- C# 使用Trace记录程序日志
- [学习笔记]c#中的委托、事件、Func、Predicate、Observer设计模式以及其他
- C#基础篇 重写与重载,以及其中设计的虚方法和抽象方法的使用和区别
- 《C# 设计模式》笔记: 第4章 在C#中使用类和对象
- JAVA使用笔记一(配置日志文件logback以及jetty配置)
- c#学习笔记之九 事件(event)的使用,一个简单的例子揭示其设计理念
- C# 使用TraceSource记录程序日志(转载)
- c#如何使用 Debug 和 Trace 类(转)
- C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志
- C# 使用TraceSource记录程序日志
- 『框架设计(第2版)CLR Via C#』学习笔记——使用is和as操作符来进行强制类型转换
- 设计模式笔记1 - 简单工厂 和 工厂模式理解以及使用
- 【笔记】使用.net中的Debug与Trace加强调试能力(SamWang)
- Atitit. 数据库-----catalog与schema的设计区别以及在实际中使用 获取数据库所有库表 java jdbc php c#.Net