加入收藏 | 网站地图 | | RSS | WAP
你好,游客 登录 注册 搜索

C#使用Trace和Debug实现程序日志输出功能

[日期:2014-04-02] 作者: 来源: [字体: ]

C#程序的日志跟踪输出管理在项目开发中最常用的就是Log4Net了。不过其实不用第三方dll类库,我们照样可以实现日志记录输出功能。

System.Diagnostics.Trace和System.Diagnostics.Debug是微软.net为我们提供的两个静态类。通过他们我们可以实现日志的跟踪输出记录。

使用举例:

using System.Diagnostics;

 

...

...

     Trace.TraceError("这是一个Error级别的日志");

     Trace.TraceWarning("这是一个Warning级别的日志");

     Trace.TraceInformation("这是一个Info级别的日志");

     Trace.WriteLine("这是一个普通日志");

     Trace.Flush();//立即输出

...

...

更多使用方法,请参考msdn。Trace,Debug的调用方式完全相同,不同的地方在于Debug的所有方法都有属性:

[Conditional("DEBUG")]

这说明在Release模式下(没有定义DEBUG常量时),该方法不会被编译的(不是不执行,而是根本不会编译到程序中去)。也就是说 Debug.XXX() 方法仅在Debug模式下运行,这个又可以为我们省下很多事。

Trace和Debug中的方法的默认行为是输出到控制台Console,和Console.Write是一样的

但是我们通过改变他的监听器TraceListener,来实现更多的操作

必须实现的方法有

void Write(string message);
void WriteLine(string message);

不过也可以主动重写其他方法

随便写一个MyTraceListener

class MyTraceListener : TraceListener

{

    public override void Write(string message)

    {

        File.AppendAllText("d:\\1.log",message);

    }

 

    public override void WriteLine(string message)

    {

        File.AppendAllText("d:\\1.log", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss    ") + message + Environment.NewLine);

    }

}

然后在程序入口,初始化侦听器Listener:

static void Main(string[] args)
{
    Trace.Listeners.Clear();  //清除系统监听器 (就是输出到Console的那个)
    Trace.Listeners.Add(new MyTraceListener()); //添加MyTraceListener实例
}

关于日志的输出格式,我们可以灵活控制,比如:
public override void Write(object o, string category) { string msg = ""; if (string.IsNullOrWhiteSpace(category) == false) //category参数不为空 { msg = category + " : "; } if (o is Exception) //如果参数o是异常类,输出异常消息+堆栈,否则输出o.ToString() { var ex = (Exception)o; msg += ex.Message + Environment.NewLine; msg += ex.StackTrace; } else if(o != null) { msg = o.ToString(); } WriteLine(msg); }

还有另外一种扩展性比较好的日志调用方式:

把刚才的MyTraceListener独立成一个项目,编译为dll,并且为他增加一个构造函数和FilePath属性用于设置将log文件的位置。

public class MyTraceListener : TraceListener { public string FilePath { get; private set; } public MyTraceListener(string filepath) { FilePath = filepath; } public override void Write(string message) { File.AppendAllText(FilePath, message); } public override void WriteLine(string message) { File.AppendAllText(FilePath, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + message + Environment.NewLine); } public override void Write(object o, string category) { string msg = ""; if (string.IsNullOrWhiteSpace(category) == false) //category参数不为空 { msg = category + " : "; } if (o is Exception) //如果参数o是异常类,输出异常消息+堆栈,否则输出o.ToString() { var ex = (Exception)o; msg += ex.Message + Environment.NewLine; msg += ex.StackTrace; } else if (o != null) { msg = o.ToString(); } WriteLine(msg); } } 配置文件:

<?XML version="1.0" encoding="utf-8" ?> <configuration> <system.diagnostics> <trace autoflush="false" indentsize="4"> <listeners> <clear /><!--清除默认监听器--> <!--添加自定义监听器 initializeData 就是初始化参数--> <add name="MyTraceListener" type="MyLog.MyTraceListener, MyLog, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" initializeData="d:\1.log" /> </listeners> </trace> <switches> <!--这里可以设定监听级别,可以设置Error,Warning,Info或者留空--> <add name="MyTraceListener" value="Error" /> </switches> </system.diagnostics> </configuration>

其中type参数可以这样获得 

typeof(MyLog.MyTraceListener).AssemblyQualifiedName

 演示程序源代码下载LogDemo.rar

如果你还是觉得log4net好用,坚持要用log4net的话,那么好吧,你可以这样写MyTraceListener:

public class MyTraceListener : TraceListener

{

    log4net _log = new log4net();

 

    public MyTraceListener(string filepath)

    {

        _log = new log4net();

        _log.FilePath = filepath;

    }

 

    public override void Write(string message)

    {

        _log.Info(message);

    }

 

    public override void WriteLine(string message)

    {

        _log.Info(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss    ") + message + Environment.NewLine);

    }

}

关键词:日志  输出  跟踪 

收藏 推荐 打印 | 录入:blue1000 | 阅读:
本文评论   查看全部评论 (2)
表情: 姓名: 字数
点评:
       
评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事/刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款
第 2 楼
* 匿名 发表于 2016/12/25 12:46:55
http://www.blue1000.com/bkhtml/c159/2013-03/71093.htm 小学班主任工作计划 http://www.135995.com/show/72.html 2015年初中班主任德育工作计划 http://www.135995.com/show/59.html
第 1 楼
* 匿名 发表于 2016/12/24 12:45:40
http://www.blue1000.com/bkhtml/c159/2013-03/71093.htm 田园风景作文 http://www.135995.com/details/zs1039.html 校园风景线作文 http://www.135995.com/details/zs1240.html