【深呼吸】写入日志文件

阅读: 评论:0

【深呼吸】写⼊⽇志⽂件
记录⽇志,⼀⽅⾯可以把⽇志写⼊系统的⽇志存储中,可在“事件查看器”窗⼝中查看;如果不喜欢写到系统的⽇志⽂件中,也可以写到⾃⼰定义的⽂件中。
其实,⽇志⽂件就是⽂本⽂件,可能有朋友会想到⽤写⼊⽂本⽂件的⽅式来写⽇志。当然,这样做也是可以的,不过,.NET 类型库提供了两个专⽤记录信息的类。
Debug 类⼤家都很熟悉,就是可以在VS的“输出”窗⼝写⼊调试信息,另外,有⼀个跟Debug很像的类——Trace。Debug通常只会在调试版本中使⽤,Trace既可以在调试版本中⽤,也可以⽤于发布(Release)版本。
下⾯以Write⽅法为例,看看Debug类和Trace类的定义有什么不同。
// Debug
[ConditionalAttribute("DEBUG")]
public static void Write( Object value )
// Trace
[ConditionalAttribute("TRACE")]
public static void Write( Object value )
ConditionalAttribute⽤于指定⼀个条件,当条件中给出的条件编译符号存在时才会执⾏。DEBUG和TRACE这两个符号可以在编译的时候指定,也可以在VS项⽬属性中指定。
接下来我们了解⼀下,它的公共基类是TraceListener,⽽Debug和Trace类都有⼀个Listeners集合,可以添加从TraceListener派⽣的任意实例。即使我们没有在代码中向Listeners集合添加元素,在应⽤程序运⾏时,它会⾃动添加⼀个默认的,类型为DefaultTraceListener。
好了,前⾯都是F话,只是给⼤家娱乐的,说到了DefaultTraceListener,就进⼊本⽂主题了,看⼀下,这个类是不是有个属性叫LogFileName?这就对了,只要把⽇志⽂件的相对路径或绝对路径赋给它就⾏了,⽇志⽂件可以不存在,但⽬录应该是存在的。
来来来,咱们来练习⼀下。
// 从 Listeners 集合中出默认
DefaultTraceListener listener = Trace.Listeners["Default"] as DefaultTraceListener;
www.ppm
// 指定⽇志⽂件
if (listener != null)
{
listener.LogFileName = "MyApp.log";
}
// 测试写⼊
Trace.WriteLine("今天天⽓很好。");
Trace.WriteLine("明天天⽓依旧地热。");
Trace.WriteLine(DateTime.Today.ToLongDateString());
快开阀芯刚刚说过,默认情况下,Listeners集合中会有⼀个DefaultListener,⽽且它的Name属性为“Default”,因此,我们按照名称就可以把它取出来,然后设置它的LogFileName属性,这⾥我⽤的是相对路径,即创建的⽇志⽂件位于可执⾏⽂件相同的⽬录下。
使⽤Trace类⽽不⽤Debug类,是因为Trace可以在调试版本中⽤,也可以在发布版本中⽤。从运⾏过程来看,跟踪信息既会出现在“输出”窗⼝中,也会同时写⼊前⾯指定的⽇志⽂件中。
待上⾯⽰例运⾏后,再到程序⽬录下,⽤记事本打开⽇志⽂件,就能看到记录的信息了。
要是你⽐较不喜欢⽤默认的,还可以先把Listeners集合清空,然后Add⼀个别的,除了DefaultTraceListener,还有TextWriterTraceListener、XmlWriterTraceListener等,它们的继承关系就不说了,⾃⼰看⽂档。
下⾯我们来⽤TextWriterTraceListener来写⼊⽇志⽂件。
static void Main(string[] args)
{
// 清空集合
Trace.Listeners.Clear();
// 加⼊新的
TextWriterTraceListener listener = new TextWriterTraceListener("app.log");
Trace.Listeners.Add(listener);
// 测试写⼊信息
Trace.WriteLine("a - b - c");
Trace.WriteLine(DateTime.Now.ToLongTimeString());
Console.Read();
/
/ 刷新流并关闭尺寸测量
Trace.Flush();
listener.Close();
}
这⾥要注意,TextWriterTraceListener类⽤完后要调⽤Close或Flush⽅法,或者Dispose⽅法,⼜或者调⽤Trace类的Flush⽅法,反正你任选⼀种⽅案吧。因为需要这样做之后,数据才会最后写⼊到⽂件中,不然,⽂件是空⽩的。
运⾏⽰例过后,再打开app.log⽂件,得到在下⽂本。
有没有发现,配置⽇志⽂件路径写在代码中不太好玩,因为更改路径和⽂件名后就要重新编译,不如,考虑写在配置⽂件中吧。
打开配置⽂件,输⼊以下内容:
电梯制动器<configuration>
……
<system.diagnostics>
<trace autoflush="true">
<listeners>
<clear/>
<add name="test" type="System.Diagnostics.TextWriterTraceListener" initializeData="D:\TheApp.log"/>
</listeners>
</trace>
</system.diagnostics>
</configuration>
下⾯给⼤伙分析⼀下这配置⽂件的规律。
第⼀,你想想,我们刚刚讲的那些类都在哪个命名空间下?对了,System.Diagnostics,所以,对应地,在配置节中名为
system.diagnostics。
第⼆、Trace是与跟踪信息有关,所以下⼀个节点是trace。
第三、前⾯我说过,Trace和Debug类都有⼀个Listeners集合,⽤来放,是吧,所以下⼀⼦级就需要⼀个listeners节点。
第四、listeners是个集合吧,所以它应该可以添加元素,删除元素,清除元素。这就对了,add⽤来添加;remove⽤来删除;clear就是清空集合,等于调⽤Clear⽅法。
所以,上⾯配置中,clear就是把合集先清空,然后⽤add来加元素。name指定的名字,这个你可以⾃⼰取,最好不要叫“Default”,刚说过了嘛,默认的叫“Default”,你没必要⾮要⽤这个名字,你可以叫它“孙悟空”。
type指定的类型,⼀定要包含命名空间和类名,程序集中的version和pubKey这些可以不写。
initializeData是传递给TextWriterTraceListener类构造函数的数据,对它来说,应该传⼊⽇志⽂件路径。我这⾥就把它存到D盘下⾯,你可以根据你的实际情况来定。
注意:trace元素的autoflush设为true,推荐这么⼲,这样会⾃动调⽤Flush⽅法,从⽽让数据及时写⼊⽇志⽂件。
以后,你想更改⽇志⽂件路径,只要改改配置⽂件就⾏了,不必重新编译代码。
现在,这个配置你会写了吧,结构都懂了吧,⽽且VS还有智能提⽰的。要是这样你还不会写,那⽼周只好投降了。无石棉刹车片
好,配置弄好了,咱们写⼏句代码耍耍。
static void Main(string[] args)
{
Trace.WriteLine("好玩。");
家庭自制黄豆芽机
Trace.WriteLine("再写⼀⾏。");
Trace.WriteLine("Write a new line again.");
}
运⾏应⽤程序,运⾏完后,打开⽇志⽂件,会看到这样:
好了,今天的任务完成了。
经过党组织讨论决定,由于本⽂的⽰例代码实在太简单了,本⽂不提供⽰例源码⽂件。

本文发布于:2023-06-18 02:16:27,感谢您对本站的认可!

本文链接:https://patent.en369.cn/patent/3/142894.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:监听器   配置   元素
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图