C#自带组件
C#自带组件
在项目正式上线后,如果出现错误,异常,崩溃等情况
我们往往第一想到的事就是查看日志
所以日志对于一个系统的维护是非常重要的
贯穿所有的日志系统
日志系统,往往是贯穿一个程序的所有代码的;
试想一下,如果你的日志完全是由第三方组件提供的;
那么就意味着,你的所有项目都必须引用这个dll;
也许你会说自己可以2次封装,那么依然需要所有项目都引用你的这个封装后的log项目
另一方面
一些log组件需要实例化后才可以使用,比如log4net,这又意味着你得有一个全局的静态变量,或者你自己二次封装
但其实微软已经为我们提供了2个十分方便的静态类,用于日志的记录
System.Diagnostics.Trace和System.Diagnostics.Debug
关于这2个类的文档可以去看MSDN
他的使用真的是非常的方便,以至于你只要使用一次就会爱上他
不用引用任何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文件的位置

<?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就可以了
说完了...拜拜~~
代码下载
我发布的代码,没有任何版权,遵守WTFPL协议(如有引用,请遵守被引用代码的协议)
C#自带组件的更多相关文章
- [转]利用C#自带组件强壮程序日志
利用C#自带组件强壮程序日志 在项目正式上线后,如果出现错误,异常,崩溃等情况 我们往往第一想到的事就是查看日志 所以日志对于一个系统的维护是非常重要的 声明 正文中的代码只是一个栗子,一个非常简 ...
- 转载——利用C#自带组件强壮程序日志
利用C#自带组件强壮程序日志 在项目正式上线后,如果出现错误,异常,崩溃等情况 我们往往第一想到的事就是查看日志 所以日志对于一个系统的维护是非常重要的 声明 正文中的代码只是一个栗子,一个非常简 ...
- 【Unity3D】Unity自带组件—完成第一人称人物控制
1.导入unity自带的Character Controllers包 2.可以看到First Person Controller组件的构成 Mouse Look() : 随鼠标的移动而使所属物体发生旋 ...
- 利用C#自带组件强壮程序日志
在项目正式上线后,如果出现错误,异常,崩溃等情况 我们往往第一想到的事就是查看日志 所以日志对于一个系统的维护是非常重要的 声明 正文中的代码只是一个栗子,一个非常简单的栗子,只是说明这个框架是怎么工 ...
- Unity3D研究院之拓展系统自带组件的Inspector视图
转自 http://www.xuanyusong.com/archives/3455 using UnityEngine; using System.Collections; using UnityE ...
- 隐式意图调用系统自带组件的各种Uri总结
调用系统应用解析(必需要加各自使用的权限) android intent 隐式意图和显示意图(activity跳转) 显示意图要求必须知道被激活组件的包和class 隐式意图仅仅须要知道跳转acti ...
- 在ubuntu16编译安装nginx-1.10.2(full)完全自带组件
第一步:先安装全部用到的包 apt install gcc libpcre++-dev libssl-dev make \ libxml2-dev libxslt-dev libgd-dev libg ...
- windows7旗舰版系统自带组件IIS搭建ftp
1.win7,”开始“,打开”控制面板“,点击”程序“,看到”程序和功能“,如图所示: 2.点击”打开或关闭Windows功能“,如图所示: 3.成功后,打开”控制面板“,点击”系统和安全“,点击”管 ...
- 2-4 原生小程序 - 自带组件及API
获取用户的信息有两种,一种是不需要登录的,我们只需要获取用户的头像,还有微信的名.还有一种是登录的,就是登录后台校验的,就是获取用户的openid. webview,可以内嵌一个网页,类似于原生的开发 ...
随机推荐
- Android内置下拉刷新组件SwipeRefreshLayout
也许下拉刷新之前,你可能会使用一些第三方的开源库,例如PullToRefresh, ActionBar-PullToRefresh等待,但现在有的正式组成部分---SwipeRefreshLayout ...
- Robot Framework自动化测试(一)---第一个脚本(转)
最近工具中用Robot Framework框架来做自动化,所以,花时间学习了一下. =======所需环境=================== Python: https://www.python. ...
- Android Activity和Fragment生命周期图
- Spring4 SpringMVC Hibernate4 Freemaker 集成示例
变更更正(2014-05-30 13:47:22):一些IDE在web.xml我们会报告这个错误: cvc-complex-type.2.4.a: Invalid content was found ...
- CSDN下载频道2014年11月4日本-5日常维护公告
尊敬的用户: CSDN于2005年推出了下载服务.经过数年的发展.下载频道的用户已经为无数用户提供了帮助,分享500万的技术资源. CSDN下载频道将于2014年11月4日23点至11月5日8点进行积 ...
- do...while(0)神奇
1. do...while(0)消除goto语句. 通常,假设在一个函数中開始要分配一些资源.然后在中途运行过程中假设遇到错误则退出函数,当然,退出前先释放资源,我们的代码可能是这样: version ...
- 经典算法题每日演练——第八题 AC自动机
原文:经典算法题每日演练--第八题 AC自动机 上一篇我们说了单模式匹配算法KMP,现在我们有需求了,我要检查一篇文章中是否有某些敏感词,这其实就是多模式匹配的问题. 当然你也可以用KMP算法求出,那 ...
- HDU多赛学校9 HDU4969 Just a Joke 【数学积分】
数学题目 意甲冠军:的男孩向圆上的女孩跑去,保持男孩女孩圆心在同一条直线上.这过程中,男孩女孩均匀速 给出男孩女孩速度,圆的半径,男孩最长能跑的距离 问男孩是否能跑到女孩那里 能够用积分来解这道题,我 ...
- VTune使用amplxe-cl进行Hardware Event-based Sampling Analysis 0分析
于BASH正在使用VTune进行Hardware Event-based Sampling Analysis 0分析: 结果(部分)例如以下: 版权声明:本文博客原创文章.博客,未经同意,不得转载.
- 回想一下著名的BigTable论题
GFS捕捉一些业务场景的分布式文件系统的需求.很自然.此外还有一些与他们一些业务或依赖于文件系统是不那么容易,他们需要一个分布式数据库系统. BigTable那是,Google结构化数据处理的需求而产 ...