首页 > 编程语言 >利用C#自带组件强壮程序日志

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

时间:2022-11-25 17:03:11浏览次数:38  
标签:代码 string Trace C# void msg 日志 自带


 

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

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

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

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

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

那么就意味着,你的所有项目都必须引用这个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

标签:代码,string,Trace,C#,void,msg,日志,自带
From: https://blog.51cto.com/u_15834343/5887050

相关文章

  • 每个人应该知道的NVelocity用法
    ​​每个人应该知道的NVelocity用法​​<?xml:namespaceprefix=ons="urn:schemas-microsoft-com:office:office"/>NVelocity是一个基于.NET的模板引擎(templateengi......
  • cs149笔记并行图计算
    ParallelProgrammingonGraphs这些课主要讲了关于图并行算法,包括pagerank等算法。PageRankPageRank算法可以见https://en.wikipedia.org/wiki/PageRank#math_2\[R[i......
  • C语言基础
    (1)栈(stack):由编译器进行管理,自动分配和释放,存放函数调用过程中的各种参数、局部变量、返回值以及函数返回地址。操作方式类似数据结构中的栈。(2)堆(heap):用于程序动态申请分配......
  • C#.NET ASP.NET IIS 加载.pfx私钥证书时报错“出现了内部错误。”
    C#.NETASP.NETIIS加载.pfx私钥证书时报错“出现了内部错误。” 原始代码报错:X509Certificate2x509cer=newX509Certificate2(rawData,m.cert_pwd); 解决方......
  • Dubbo源码-06-ProxyFactory
    作用生产者将要导出的目标对象封装(代理技术或者反射技术)成Invoker对象一接口@SPI("javassist")publicinterfaceProxyFactory{/***createproxy.......
  • Dubbo源码-07-Protocol
    作用生产者将Invoker对象导出InjvmProtocol没有真正的干活逻辑仅仅是一些属性赋值DubboProtol启动服务RegistryProtol通过DubboProtocol启动服务注册远程配置......
  • ReentrantLock的锁竞争是否排队判断
     publicfinalbooleanhasQueuedPredecessors(){//Thecorrectnessofthisdependsonheadbeinginitialized//beforetailandonhead......
  • 24.1 SetUnhandledExceptionFilter未处理异常--《Windows核心编程》
    对于未处理异常,例如异常过滤返回EXCEPTION_CONTINUE_SEARCH,向上搜索,但无法搜索到处理部分,产生未处理异常。Windows提供了SetUnhandledExceptionFilter函数,给我们处理异常......
  • 搭建Prometheus+Grafana+AlertManager监控报警系统之CentOS 7安装node exporter
    简介在Prometheus的架构设计中,PrometheusServer并不直接服务监控特定的目标,其主要任务负责数据的收集,存储并且对外提供数据查询支持。因此为了能够能够监控到某些东西,如......
  • C# INotifyPropertyChanged Small Demo
    publicclassPChangeTest:INotifyPropertyChanged{publiceventPropertyChangedEventHandlerPropertyChanged;privatevoidOnPropertyChange......