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,可以内嵌一个网页,类似于原生的开发 ...
随机推荐
- Git与TortoiseGit基本操作(转)
1. GitHub操作 本节先简单介绍 git 的使用与操作, 然后再介绍 TortoiseGit 的使用与操作. 先看看SVN的操作吧, 最常见的是 检出(Check out ...), 更新 (U ...
- 创建和分析excel文件
jxl.jar:下载地址:http://download.csdn.net/detail/xuxu198899223/7717737 package excel; public class BookV ...
- 利用修改div的位置+js对象存储div信息 实现简单的div自定义布局功能
原文:利用修改div的位置+js对象存储div信息 实现简单的div自定义布局功能 利用修改div的位置+js对象存储div信息 实现简单的div自定义布局功能1.在界面上添加几个checkbox和一 ...
- hdu 亲和串(kmp)
Problem Description 人随着岁数的增长是越大越聪明还是越大越笨,这是一个值得全世界科学家思考的问题,同样的问题Eddy也一直在思考,因为他在很小的时候就知道亲和串如何判断了,但是发现 ...
- VB.NET与C# 语法show差异
学习VB.NET后发现,VB.NET与C#的语法基本的不同在两个部分,这两部分搞通了,那就游刃有余,迎刃而解了. 现将其对照总结例如以下: 一.实体部分 (与VB相比.在C#和VB.NET中,实体的使 ...
- Hibernate各保存方法之间的差 (save,persist,update,saveOrUpdte,merge,flush,lock)等一下
hibernate保存 hibernate要保存的目的是提供一个方法,多.它们之间有许多不同之处,点击此处详细说明.使得差: 一.预赛: 在所有.阐释.供hibernate,,transient.p ...
- C语言移位运算符
位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算.位移位运算符分为左移和右移两种,均为双目运算符.第一运算对象是移位对象,第二个运算对象是所移的二进制位数. 位移位运算符的运算对象 ...
- RPC框架实现
转载RPC框架实现 RPC(Remote Procedure Call,远程过程调用)框架是分布式服务的基石,实现RPC框架需要考虑方方面面.其对业务隐藏了底层通信过程(TCP/UDP.打包/解包.序 ...
- javascript、jQuery的扩展方法,扩展实例展示代码
$(function () { var total = 0, height = $(window).height(), memberScroll, cartScroll, proScroll; ...
- 私人定制javascript中函数小知识点
函数的定义 首先在javascript中,函数就是对象,程序可以随意操控它们.比如,可以给它们设置属性,甚至调用它们的方法.函数使用function关键字来定义.它既可以用在函数定义表达式,也可以用在 ...