记录日志,一方面可以把日志写入系统的日志存储中,可在“事件查看器”窗口中查看;如果不喜欢写到系统的日志文件中,也可以写到自己定义的文件中。

其实,日志文件就是文本文件,可能有朋友会想到用写入文本文件的方式来写日志。当然,这样做也是可以的,不过,.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; // 指定日志文件
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.");
}

运行应用程序,运行完后,打开日志文件,会看到这样:

好了,今天的任务完成了。

经过党组织讨论决定,由于本文的示例代码实在太简单了,本文不提供示例源码文件。

【.net 深呼吸】写入日志文件的更多相关文章

  1. log4Net(写入日志文件)

    这里就简单介绍下log4Net对写入日志文件的一些了解,写入数据库类似,就不在一一介绍了. 首先去log4net下载. 然后我们新建一个控制台应用程序,并引入log4net.dll程序集,log4ne ...

  2. weblogic开启http访问日志并实时写入日志文件

    由于http访问会产生大量日志,耗去不少IO和CPU所以在生产一般是不启用的:但有时我们会想启用http访问日志,尤其是在系统上线调试的时候. weblogic的日志默认在domain_name/se ...

  3. ZH奶酪:PHP error_log()将错误信息写入日志文件

    error_log() 是发送错误信息到某个地方的一个函数,在程序编程中比较常见,尤其是在程序调试阶段. bool error_log ( string $message [, int $messag ...

  4. impdp报错: ORA-39064: 无法写入日志文件 ORA-29285: 文件写入错误

    windows平台下,oracle 11.2.0.1在使用impdp向测试环境导入数据的时候,报出如下错误: 错误原因: 数据泵在写日志文件的时候,使用的是数据库字符集.如果客户端的环境变量NLS_L ...

  5. Log4j不写入日志文件排错记录

    背景: 之前用 log4j一直设置的输出到控制台.今天由于job任务出现了异常,因为是异步的,没办法在控制台看错误信息了,于是乎决定把日志打印到文件里面.然后就找了篇博客配置了下.但是配置完后,怎么也 ...

  6. flask将日志写入日志文件

    import logging logging.basicConfig(level=logging.DEBUG,#控制台打印的日志级别 filename='log_new.log', # 将日志写入lo ...

  7. expdp impdp 错误: ORA-39064: 无法写入日志文件 ORA-29285: 文件写入错误(解决方案)

    windows: 运行 -> regedit ->查找 键值 NLS_LANG 将字符集 SIMPLIFIED CHINESE_CHINA.ZHS16GBK 修改为AMERICAN_AME ...

  8. log4net在release模式下无法生成文件或不写入日志

    在Debug模式一切正常,但是在release模式下log4net不工作,查了很多资料,终于解决.具体做如下检查修改. 1.检查log4net写入日志文件路径是否正确: 2.检查对应日志文件路径是否有 ...

  9. 日志文件写入失败(permission denied)

    用过Laravel的小伙伴一开始安装完框架后可能都遇到过daily 日志文件写入失败的问题,接下来我们就来详细说下日志文件写入失败的原因以及对应的解决方案. 在讲这个问题之前可能需要简单介绍下Linu ...

随机推荐

  1. 阿里签名中URLEncode于C#URLEncod不同之处

    问题 如上图所示,阿里云的PercentEncode 转换! 为 %21 PercentEncode 源码为: package com.aliyuncs.auth; import java.io.Un ...

  2. 【开源】.Net 分布式服务中心

    分布式服务中心 开源地址: http://git.oschina.net/chejiangyi/Dyd.BaseService.ServiceCenter 当垂直应用越来越多,应用之间交互不可避免,将 ...

  3. myeclipse 内存不够用报错PermGen space 和 An internal error has occurred.

    最近项目中又增加了新的模块,项目的代码又多了不少.运行的时候总是报如下错误 Exception in thread "http-apr-80-exec-6" java.lang.O ...

  4. bash字符串操作

    参考 http://www.cnblogs.com/chengmo/archive/2010/10/02/1841355.html 问题:bash怎么提取字符串的最后一位?例如python中strin ...

  5. Tableau未必最佳,国内BI也能突破重围!

    如今,百度一下商业智能或BI工具,总能看到Tableau的身影.并不是Tableau的营销做得好,而是国内对于商业智能工具的认知和选择似乎都落在了Tableau身上.导致不管业内业外都对商业智能的概念 ...

  6. JAVA装饰者模式(从现实生活角度理解代码原理)

    装饰者模式可以动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 该模式的适用环境为: (1)在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职 ...

  7. Android Weekly Notes Issue #237

    Android Weekly Issue #237 December 25th, 2016 Android Weekly Issue #237 这是本年的最后一篇issue, 感谢大家. 本期内容包括 ...

  8. Form 表单提交参数

    今天因为要额外提交参数数组性的参数给form传到后台而苦恼了半天,结果发现,只需要在form表单对应的字段html空间中定义name = 后台参数名 的属性就ok了. 后台本来是只有模型参数的,但是后 ...

  9. Vim使用

    模式 ESC\Ctrl+c:退出编辑模式 ZZ\wq:命令模式下保存退出 编辑 i:进入编辑模式 I:转到行首非空字符开始编辑 s:删除当前字符进入编辑模式 a:从当前字符后开始编辑 A:从当前行末非 ...

  10. github中的watch、star、fork的作用

    [转自:http://www.jianshu.com/p/6c366b53ea41] 在每个 github 项目的右上角,都有三个按钮,分别是 watch.star.fork,但是有些刚开始使用 gi ...