zoukankan      html  css  js  c++  java
  • WriteLog

    转载自 http://blog.csdn.net/zzh920625/article/details/52304848

    两个线程:

    1. <span style="font-family:Microsoft YaHei;font-size:14px;">static void Main(string[] args)  
    2. {  
    3.     //实例化带参数的线程的写法 - zzh - 2016年8月22日  
    4.     Thread th1 = new Thread(new ParameterizedThreadStart(MakeException));  
    5.     Thread th2 = new Thread(new ParameterizedThreadStart(MakeException));  
    6.   
    7.     //开启线程 - zzh - 2016年8月22日  
    8.     th1.Start("Thread1");  
    9.     th2.Start("Thread2");  
    10. }</span>  
    <span style="font-family:Microsoft YaHei;font-size:14px;">static void Main(string[] args)
    {
        //实例化带参数的线程的写法 - zzh - 2016年8月22日
        Thread th1 = new Thread(new ParameterizedThreadStart(MakeException));
        Thread th2 = new Thread(new ParameterizedThreadStart(MakeException));
    
        //开启线程 - zzh - 2016年8月22日
        th1.Start("Thread1");
        th2.Start("Thread2");
    }</span>

           

         然后填充线程调用的MakException()方法:

    1. <span style="font-family:Microsoft YaHei;font-size:14px;">/// <summary>  
    2. /// 制造异常 - zzh - 2016年8月23日  
    3. /// </summary>  
    4. /// <param name="Tag">传入标签</param>  
    5. public static void MakeException(object Tag)  
    6. {  
    7.     try  
    8.     {  
    9.         //异常操作一:直接throw异常信息  
    10.         throw new Exception("测试异常");  
    11.         //异常操作二:写一个除以零的错误代码段  
    12.         int a = 1, b = 0, c;  
    13.         c = a / b;  
    14.   
    15.     }  
    16.     catch (Exception ex)  
    17.     {  
    18.         WriteLog(ex, Tag.ToString()); //该方法还可以传入自己想要打印错误文本的路径  
    19.     }  
    20. }</span>  
    <span style="font-family:Microsoft YaHei;font-size:14px;">/// <summary>
    /// 制造异常 - zzh - 2016年8月23日
    /// </summary>
    /// <param name="Tag">传入标签</param>
    public static void MakeException(object Tag)
    {
        try
        {
            //异常操作一:直接throw异常信息
            throw new Exception("测试异常");
            //异常操作二:写一个除以零的错误代码段
            int a = 1, b = 0, c;
            c = a / b;
    
        }
        catch (Exception ex)
        {
            WriteLog(ex, Tag.ToString()); //该方法还可以传入自己想要打印错误文本的路径
        }
    }</span>

          这段代码在实际应用当中就要放到可能出现异常的地方,包括大量运算段、复杂逻辑段当中,上述例子中,我在try块当中写了两个异常,catch中通过WriteLog()方法来抓取他们,传入参数Tag.

         接下来实现WriteLog方法:

    1. <span style="font-family:Microsoft YaHei;font-size:14px;">public static object locker = new object();  
    2.   
    3. /// <summary>  
    4. /// 将异常打印到LOG文件  
    5. /// </summary>  
    6. /// <param name="ex">异常</param>  
    7. /// <param name="LogAddress">日志文件地址</param>  
    8. /// <param name="Tag">传入标签(这里用于标识函数由哪个线程调用)</param>  
    9. public static void WriteLog(Exception ex, string Tag = "", string LogAddress = "")  
    10. {  
    11.     lock (locker)  
    12.     {  
    13.         //如果日志文件为空,则默认在Debug目录下新建 YYYY-mm-dd_Log.log文件  
    14.         if (LogAddress == "")  
    15.         {  
    16.             LogAddress = Environment.CurrentDirectory + '\' +  
    17.                 DateTime.Now.Year + '-' +  
    18.                 DateTime.Now.Month + '-' +  
    19.                 DateTime.Now.Day + "_Log.log";  
    20.         }  
    21.   
    22.         //把异常信息输出到文件  
    23.         StreamWriter sw = new StreamWriter(LogAddress, true);  
    24.         sw.WriteLine(String.Concat('[', DateTime.Now.ToString(), "] Tag:" + Tag));  
    25.         sw.WriteLine("异常信息:" + ex.Message);  
    26.         sw.WriteLine("异常对象:" + ex.Source);  
    27.         sw.WriteLine("调用堆栈: " + ex.StackTrace.Trim());  
    28.         sw.WriteLine("触发方法:" + ex.TargetSite);  
    29.         sw.WriteLine();  
    30.         sw.Close();  
    31.     }  
    32. }</span>  
    <span style="font-family:Microsoft YaHei;font-size:14px;">public static object locker = new object();
    
    /// <summary>
    /// 将异常打印到LOG文件
    /// </summary>
    /// <param name="ex">异常</param>
    /// <param name="LogAddress">日志文件地址</param>
    /// <param name="Tag">传入标签(这里用于标识函数由哪个线程调用)</param>
    public static void WriteLog(Exception ex, string Tag = "", string LogAddress = "")
    {
        lock (locker)
        {
            //如果日志文件为空,则默认在Debug目录下新建 YYYY-mm-dd_Log.log文件
            if (LogAddress == "")
            {
                LogAddress = Environment.CurrentDirectory + '\' +
                    DateTime.Now.Year + '-' +
                    DateTime.Now.Month + '-' +
                    DateTime.Now.Day + "_Log.log";
            }
    
            //把异常信息输出到文件
            StreamWriter sw = new StreamWriter(LogAddress, true);
            sw.WriteLine(String.Concat('[', DateTime.Now.ToString(), "] Tag:" + Tag));
            sw.WriteLine("异常信息:" + ex.Message);
            sw.WriteLine("异常对象:" + ex.Source);
            sw.WriteLine("调用堆栈:
    " + ex.StackTrace.Trim());
            sw.WriteLine("触发方法:" + ex.TargetSite);
            sw.WriteLine();
            sw.Close();
        }
    }</span>

         1、考虑到错误日志的路径问题,默认路径Environment.CurrentDirectory(项目的bin文件夹下),也可以通过传入第三个参数直接跳过生成存储路径的过程。

         2、引入using System.IO,通过StreamWriter实例化类,传入Log生成地址,在文件中打印”异常信息(ex.Message)”,这个东西也是我在之前仅仅写到的、打印异常引发的对象(ex.Source);“触发方式”,说明在哪个方法调用过程中除了问题,提升具体的方法;”调用堆栈(ex.StackTrace)",打印出异常代码在具体的哪个文件、哪一行当中

        “调用堆栈:在 Log.Program.MakeException(Object Tag) 位置 g:LekeLogLogProgram.cs:行号 36”。

         3、关闭StreamWriter;

         执行完我写的两个异常之后,错误日志截图:

            

  • 相关阅读:
    反射
    ASP.NET
    解析命令行
    Private和Protected方法
    洗牌算法
    目标指向、Icon图标的错误
    数字签名与数字证书
    (Java实现) 最大团问题 部落卫队
    (Java实现) 最大团问题 部落卫队
    (Java实现)洛谷 P1164 小A点菜
  • 原文地址:https://www.cnblogs.com/TJessica/p/6365673.html
Copyright © 2011-2022 走看看