`
pcajax
  • 浏览: 2200889 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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


复制代码
    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

分享到:
评论

相关推荐

    日志组件,C#开发的日志组件

    本日志组件是使用C#编程语言编写的,C#是微软开发的一种面向对象的编程语言,具有丰富的类库和强大的功能,特别适合开发Windows桌面应用、Web应用以及游戏等。 日志组件的核心功能通常包括以下几个方面: 1. **...

    C#开发用日志输出&查看组件

    总的来说,这个"C#开发用日志输出&查看组件"是一个全面的日志解决方案,它既提供了丰富的日志输出接口,又具备直观的日志查看工具,对于任何使用C#开发的应用程序来说,都是一个值得采用的实用工具。通过合理使用这...

    c#中调用com组件

    ### c#中调用COM组件 ...这种方式不仅可以提高代码复用率,还能充分利用现有的组件库来扩展应用程序的功能。在实际开发中,还可能遇到各种具体问题,如版本兼容性、安全性等,都需要开发者在实践中不断探索和解决。

    visual c#基于组件的开发

    《Visual C# 基于组件的开发》 在编程领域,Visual C#(简称C#)是一种由微软公司推出的面向对象的编程语言,它在...通过理解和熟练掌握组件开发,开发者可以更好地利用C#的强大功能,构建出高效、稳定的软件系统。

    c#自定义组件及添加工具箱图标的方法和示例源码

    在C#编程中,自定义组件的开发是提高软件可扩展性和灵活性的重要手段。通过创建自己的控件,我们可以满足特定项目需求,同时增加代码的复用性。本篇将详细介绍如何进行C#自定义组件的开发,以及如何为这些组件添加...

    Visual C#基于组件的开发

    本教程旨在帮助开发者掌握如何利用C#进行高效且可靠的组件开发。 首先,我们要理解组件的基础概念。组件是独立的、具有特定功能的软件模块,可以被其他应用程序或组件调用。在.NET Framework中,组件通常是实现.NET...

    c#log日志类和日志分析器(源码)

    日志是程序运行过程中产生的事件记录,这些记录包含了时间戳、事件级别(如调试、信息、警告、错误等)、发生事件的组件或方法,以及事件相关的详细信息。在C#中,有多种方式实现日志记录,例如使用System....

    C#使用FileSystemWatcher组件监视系统日志文件是否被更改

    综上所述,使用`FileSystemWatcher`组件在C#中监视系统日志文件的变更是一项强大的功能,可以帮助开发者实现动态响应文件系统的变化,从而提高应用程序的智能化和实时性。在实际编程过程中,需要综合考虑性能、资源...

    C# 自带编译器实现程序运行过程中动态编译并运行字符串中的C#代码

    C# 自带编译器实现程序运行过程中动态编译并运行字符串中的C#代码

    C#调用COM组件方法总结

    本篇文章总结了C#调用COM组件的方法,涵盖了将COM类型信息转换为.NET元数据、查看元数据、测试程序等多个步骤。下面是对应的知识点: 一、将COM类型信息转换为.NET元数据 在C#调用COM组件时,首先需要将COM类型...

    C# com 组件注册及调用

    通过创建、注册COM组件,并在其他应用程序中调用,我们可以利用已有的COM对象库,提高代码的复用性和兼容性。理解并掌握这一技术,对于提升C#开发者的综合能力至关重要。通过学习提供的压缩包文件中的案例,你可以更...

    Visual C#基于组件的开发(源码)

    在C#编程中,组件是一种可重用的代码单元,它可以被其他程序或应用程序直接引用,从而提高开发效率和代码质量。C#类是构建组件的基础,每个类都定义了一组相关操作和数据,可以看作是对象的蓝图。通过继承、封装和...

    超好用的C# Log日志控件

    在C#编程中,日志记录是一个至关重要的实践,它帮助开发者跟踪程序运行状态,调试错误,以及在生产环境中监控应用程序的行为。"超好用的C# Log日志控件"是一个专门针对C#设计的日志管理工具,通过简单地引用DLL库,...

    C#高性能日志组件2009年3月更新

    《C#高性能日志组件:EAF Log框架的探索与应用》 日志记录是软件开发中的重要一环,它不仅有助于调试,还能为系统监控和问题排查提供关键信息。在C#编程环境中,有一个名为EAF(Enterprise Application Framework)...

    C#组件开发简易教程.

    通过学习这个C#组件开发简易教程,你将能够理解组件的基本概念,掌握组件开发的关键技术和实践,为构建高效、可维护的C#应用程序打下坚实基础。在实际开发过程中,不断实践和优化,将使你成为组件开发的专家。

    C#利用自带控件实现圆形指示灯

    "C#利用自带控件实现圆形指示灯"这个项目就是这样一个例子,它展示了如何利用C#的基础控件和事件处理机制来构建一个具有特定功能的UI组件。下面我们将详细探讨这一主题。 首先,C#中的圆形指示灯通常用于表示某种...

    C#编写的日志记录组件

    在C#中实现日志记录组件可以利用.NET框架提供的类库,如System.Diagnostics命名空间下的Trace和Debug类,也可以使用更高级的第三方库如log4net、NLog等。 一个好的日志记录组件应该具备良好的性能,对系统资源的...

    一个基于C# .Net 2 的邮件管理组件程序

    标题中的“一个基于C# .Net 2 的邮件管理组件程序”指的是这是一个使用C#编程语言,基于微软的.NET Framework 2.0版本构建的邮件处理软件开发组件。这种组件通常是为了帮助开发者在他们的应用程序中集成邮件发送和...

    C#皮肤组件 需要皮肤的可以下载!

    总的来说,C#皮肤组件,特别是像IrisSkin2.dll这样的库,为开发者提供了一种方便的方式来提升C#应用程序的视觉效果,增强了用户体验。通过熟练掌握这类皮肤组件的使用,开发者可以在保证功能完善的同时,也能创造出...

Global site tag (gtag.js) - Google Analytics