C#自带组件

在项目正式上线后,如果出现错误,异常,崩溃等情况

我们往往第一想到的事就是查看日志

所以日志对于一个系统的维护是非常重要的

贯穿所有的日志系统

日志系统,往往是贯穿一个程序的所有代码的;

试想一下,如果你的日志完全是由第三方组件提供的;

那么就意味着,你的所有项目都必须引用这个dll;

也许你会说自己可以2次封装,那么依然需要所有项目都引用你的这个封装后的log项目

另一方面

一些log组件需要实例化后才可以使用,比如log4net,这又意味着你得有一个全局的静态变量,或者你自己二次封装

但其实微软已经为我们提供了2个十分方便的静态类,用于日志的记录

System.Diagnostics.Trace和System.Diagnostics.Debug

关于这2个类的文档可以去看MSDN

System.Diagnostics.Trace

System.Diagnostics.Debug

他的使用真的是非常的方便,以至于你只要使用一次就会爱上他

不用引用任何dll,因为他是微软自家的东西,就在System.dll中

调用他的方法也很简单

using System.Diagnostics;

...
...
Trace.TraceError("这是一个Error级别的日志");
Trace.TraceWarning("这是一个Warning级别的日志");
Trace.TraceInformation("这是一个Info级别的日志");
Trace.WriteLine("这是一个普通日志");
Trace.Flush();//立即输出
...
...

当然方法不止只有4个,更多的可以参考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);
}
}

现在程序入口中初始化监听器Trace.Listeners

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

在随便来个方法测试下

private static void Test()
{
try
{
int i = 0;
Console.WriteLine(5 / i); //出现除0异常
}
catch (Exception ex)
{
Trace.TraceError("出现异常:" + ex.Message);//记录日志
}
}

由于大部分方法都是可重写的,所以其实最终输出什么都是可以灵活处理的

例如这样

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);
}
private static void Test()
{
try
{
int i = 0;
Console.WriteLine(5 / i); //出现除0异常
}
catch (Exception ex)
{
Trace.Write(ex, "计算员工工资出现异常");
}
}

其他的就自己举一反三了

通过配置文件初始化监听器

通过配置文件初始化监听器比直接写代码稍稍复杂一点,但是也更方便,我们可以快速的,不重新编译系统,即可进行对日志监听器进行设定

特别是在Web项目中,这将变得更加方便

我把刚才的MyTraceListener独立成一个项目,编译为dll

并且为他增加一个构造函数和FilePath属性用于设置将log文件的位置

 MyTraceListener
配置文件
<?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

Version,Culture,PublicKeyToken 也可以忽略

测试一下

没有任何问题

而且如果你用了log4net等第三方组件的话,只需要在实现TraceListener的项目中引用log4net就可以了

说完了...拜拜~~

代码下载

LogDemo.rar

我写的文章,除了纯代码,其他的都是想表达一种思想,一种解决方案.希望各位看官不要局限于文章中的现成的代码,要多关注整个文章的主题思路,谢谢!

我发布的代码,没有任何版权,遵守WTFPL协议(如有引用,请遵守被引用代码的协议)
 
分类: ASP.NETC#
标签: C#源码调试日志

C#自带组件的更多相关文章

  1. [转]利用C#自带组件强壮程序日志

    利用C#自带组件强壮程序日志   在项目正式上线后,如果出现错误,异常,崩溃等情况 我们往往第一想到的事就是查看日志 所以日志对于一个系统的维护是非常重要的 声明 正文中的代码只是一个栗子,一个非常简 ...

  2. 转载——利用C#自带组件强壮程序日志

    利用C#自带组件强壮程序日志   在项目正式上线后,如果出现错误,异常,崩溃等情况 我们往往第一想到的事就是查看日志 所以日志对于一个系统的维护是非常重要的 声明 正文中的代码只是一个栗子,一个非常简 ...

  3. 【Unity3D】Unity自带组件—完成第一人称人物控制

    1.导入unity自带的Character Controllers包 2.可以看到First Person Controller组件的构成 Mouse Look() : 随鼠标的移动而使所属物体发生旋 ...

  4. 利用C#自带组件强壮程序日志

    在项目正式上线后,如果出现错误,异常,崩溃等情况 我们往往第一想到的事就是查看日志 所以日志对于一个系统的维护是非常重要的 声明 正文中的代码只是一个栗子,一个非常简单的栗子,只是说明这个框架是怎么工 ...

  5. Unity3D研究院之拓展系统自带组件的Inspector视图

    转自 http://www.xuanyusong.com/archives/3455 using UnityEngine; using System.Collections; using UnityE ...

  6. 隐式意图调用系统自带组件的各种Uri总结

    调用系统应用解析(必需要加各自使用的权限)  android intent 隐式意图和显示意图(activity跳转) 显示意图要求必须知道被激活组件的包和class 隐式意图仅仅须要知道跳转acti ...

  7. 在ubuntu16编译安装nginx-1.10.2(full)完全自带组件

    第一步:先安装全部用到的包 apt install gcc libpcre++-dev libssl-dev make \ libxml2-dev libxslt-dev libgd-dev libg ...

  8. windows7旗舰版系统自带组件IIS搭建ftp

    1.win7,”开始“,打开”控制面板“,点击”程序“,看到”程序和功能“,如图所示: 2.点击”打开或关闭Windows功能“,如图所示: 3.成功后,打开”控制面板“,点击”系统和安全“,点击”管 ...

  9. 2-4 原生小程序 - 自带组件及API

    获取用户的信息有两种,一种是不需要登录的,我们只需要获取用户的头像,还有微信的名.还有一种是登录的,就是登录后台校验的,就是获取用户的openid. webview,可以内嵌一个网页,类似于原生的开发 ...

随机推荐

  1. CodeIgniter入门——HelloWorld

    原文:CodeIgniter入门--HelloWorld CodeIgniter(CI)是一套给PHP网站开发者使用的应用程序开发框架和工具包. 初次接触,来一个HelloWorld~~~ ^_^ 准 ...

  2. thinkphp学习笔记4—眼花缭乱的配置

    原文:thinkphp学习笔记4-眼花缭乱的配置 1.配置类别 ThinkPHP提供了灵活的全局配置功能,ThinkPHP会依次加载管理配置>项目配置>调试配置>分组配置>扩展 ...

  3. RTP 记录 log 该机制

    我们 RCV 在这里,经常跑concurrent request RTP: Receiving Transaction Processor, 它主要是用来处理 RCV_TRANSACTIONS_INT ...

  4. React实践

    React实践(一)   该实践取自官方教程:https://github.com/reactjs/react-tutorial 主要是自实现的过程以及一些心得体会 该实践是实现一个评论框. 一个展示 ...

  5. 如何为ios酷我音乐盒下载导出的音乐文件(使用Java程序设计)

    这个工具已经准备第二版,读者了解编程软件,可以直接使用,请阅读和使用这个场地 http://blog.csdn.net/jzj1993/article/details/44459983 本文所涉及内容 ...

  6. CSS3新功能简要

    1.CSS3 框架:    由 CSS3,您可以创建圆角.加入到该矩形阴影,使用图片绘制边框.例如 * border-radius -border-*-radius(top,left,right,bo ...

  7. crawler_jsoup HTML解析器_使用选择器语法来查找元素

    参照:http://www.open-open.com/jsoup/selector-syntax.htm 使用选择器语法来查找元素 问题 你想使用类似于CSS或jQuery的语法来查找和操作元素. ...

  8. ocp11g培训内部教材_053课堂笔记(043)_数据备份

    053:数据库高级管理: 目录 第一部分:数据库备份与恢复... 4 第一章:备份恢复概述... 4 1.1 备份的意义: 4 1.2 数据库故障的类型:... 4 1.3 制定你的备份和恢复的计划. ...

  9. 多维算法思考(三):AB组合问题

    多维算法思考(三):AB组合问题 题目:x个A,y个B可以组合成多少个不同排列的问题. 首先,我们用数学的方式思考,这个问题属于<组合数学>的问题,我们的第一种方法可以用组合思路来求解. ...

  10. 转载使用Flurl制作可复用的分页组件

    使用Flurl制作可复用的分页组件 使用ASP.NET MVC查询时,一直使用MvcPaging组件,虽然需要自定义MvcPaging.Pager才能达到我想要的效果,但在没有较好的URL库时,还是这 ...