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

利用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

PS下:Trace和Debug的监听器的共用的

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文件的位置

    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

Version,Culture,PublicKeyToken 也可以忽略

测试一下

没有任何问题

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

说完了...拜拜~~

代码下载

LogDemo.rar

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);
    }
}

这样是不是就可以用log4net了啊,是不是就可以用其他log系统了啊 ,是不是就想写数据库就写数据库 想写文件就写文件, 写干啥就干啥了啊~~~~~~

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

时间: 2024-08-08 02:07:40

[转]利用C#自带组件强壮程序日志的相关文章

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

前言 在项目正式上线后,如果出现错误.异常.崩溃等情况, 我们往往第一想到的事就是查看日志. 所以日志对于一个系统的维护是非常重要的. 声明 本文中的示例代码旨在这个框架是怎么工作的,具体实现可以自由发挥. 贯穿所有的日志系统 日志系统,往往是贯穿一个程序的所有代码的; 试想一下,如果你的日志完全是由第三方组件提供的; 那么就意味着,你的所有项目都必须引用这个dll; 也许你会说自己可以2次封装,那么依然需要所有项目都引用你的这个封装后的log项目, 另一方面 一些log组件需要实例化后才可以使

利用hadoop自带程序运行wordcount

1.启动hadoop守护进程 bin/hadoop start-all.sh 2.在hadoop的bin目录下建立一个input文件夹 mkdire input 3.进入input目录之后,在input目录下新建两个文本文件,并想其写入内容 echo "hello excuse me fuck thank you">test1.txt echo "hello how do you do thank you">test2.txt 4.进入hadoop的bi

利用jdk自带的运行监控工具JConsole观察分析Java程序的运行

利用jdk自带的运行监控工具JConsole观察分析Java程序的运行 原文链接 一.JConsole是什么 从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行.您可以轻松地使用 JConsole(或者,它更高端的 “近亲” VisualVM )来监控 Java 应用程序性能和跟踪 Java 中的代码. 二.如何启动JConsole 如果是从命令行启动,使 JDK 在 PATH 上,运行 jconsole

如何用OpenCV自带的adaboost程序训练并检测目标

http://www.cnblogs.com/easymind223/archive/2012/07/03/2574826.html OpenCV自带的adaboost程序能够根据用户输入的正样本集与负样本集训练分类器,常用于人脸检测,行人检测等.它的默认特征采用了Haar,不支持其它特征. Adaboost的原理简述:(原文) 每个Haar特征对应看一个弱分类器,但并不是任伺一个Haar特征都能较好的描述人脸灰度分布的某一特点,如何从大量的Haar特征中挑选出最优的Haar特征并制作成分类器用

002带图标的程序菜单

技术要点: 要实现带图标的菜单,需要从CMenu类派生一个子类,并在子类中改写DrawItem方法和MeasureItem方法.基本思路如下: 首先,定义一个记录菜单项信息的结构CMenuItemInfo,该结构包含了菜单项的文本.图像索引.ID等信息. 然后,从CMenu中派生一个子类CIconMenu.在该类中定义一个方法ChangeMenuItem,利用递归的方式修改所有的菜单项信息,使其具有自绘风格(MF_OWNERDRAW). 接着,在CIconMenu类中定义绘制菜单项文本.绘制菜单

sphider 丁廷臣简体中文完美汉化版带蜘蛛搜索引擎程序 v1.3.4

sphider 丁廷臣简体中文完美汉化版带蜘蛛搜索引擎程序 v1.3.4是最官方的新版,免费开源,用官方最新发布原版汉化.未更改任何内核文件. Sphider 是一个完美的带有蜘蛛的搜索引擎程序. Sphider是一个轻量级,采用PHP开发的web spider和搜索引擎,使用mysql来存储数据.可以利用它来为自己的网站添加搜索功能.Sphider非常小,易于安装和修改,已经有数千网站在使用它. 官方主页 http://www.sphider.eu/ 点击下载sphider 丁廷臣简体中文完美

[应用]来点实际,利用CB刷简历更新时间程序(python)

实际上就是一个python的curl应用.应tom的要求,现在公布给大家.希望能对大家有用. http://onefishum.blog.163.com/bl ... 052013324114213898/ 目前高端的工作是越来越难找了.本人做了51.zhaopin.猎聘网的刷简历程序,都和此类似,但目前这几个号称最大的招聘网站,根据我一段时间的跟踪分析,发现从去年开始,人员需求基本为0,大部招聘都是假的.所以开发才想做一个刷新简历更新时间程序,以便加大自身机会(工作不换工资不涨,为了活呀,只能

利用htmlunit登陆带验证码图片的网站

http://htsoft.org/html/y2011/822_using-htmlunit-landing-site-with-captcha-image.html 利用htmlunit登陆带验证码图片的网站 2011年09月15日 ⁄ 编程语言 ⁄ 共 1266字 ⁄ 字号 小 中 大 ⁄ 暂无评论 ⁄ 阅读 7,088 次 以百度统计为例,说明下如何用htmlunit登陆带验证码的网站 //baidu统计登陆代码 try { WebClient client = new WebClien

C# 利用VS自带的WSDL工具生成WebService服务类

C# 利用VS自带的WSDL工具生成WebService服务类 wsdl /language:c# /n:空间名 /out:D:/类名 webService接口地址