欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#實現(xiàn)線程安全的簡易日志記錄方法

 更新時間:2014年08月04日 16:20:31   投稿:shichen2014  
這篇文章主要介紹了C#實現(xiàn)線程安全的簡易日志記錄方法,比較實用的功能,需要的朋友可以參考下

一般在實際項目的開發(fā)中,會要求涉及日志記錄的問題,比較常用的有Log4Net,NLog等幾個,而小項目小工具的話,則無需費此大駕。而譬如串口開發(fā)的話,需要記錄串口過來的數(shù)據(jù)等等,這時候就要考慮日志記錄上線程的問題。對此,為了方便后續(xù)使用,封裝了下代碼:

using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Threading;

namespace CSharpUtilHelpV2
{
  /// <summary>
  /// 日志類型枚舉
  /// </summary>
  public enum LogType
  {
    /// <summary>
    /// 一般輸出
    /// </summary>
    Trace,
    /// <summary>
    /// 警告
    /// </summary>
    Warning,
    /// <summary>
    /// 錯誤
    /// </summary>
    Error,
    /// <summary>
    /// SQL
    /// </summary>
    SQL
  }
  /// <summary>
  /// 基于.NET 2.0日志工具類
  /// </summary>
  public class LogToolV2
  {
    private static readonly Thread LogTask;
    private static readonly ThreadSafeQueueV2<string> LogColQueue;//自定義線程安全的Queue
    private static readonly object SyncRoot;
    private static readonly string FilePath;
    private static readonly long BackFileSize_MB = 2;//超過2M就開始備份日志文件
    static LogToolV2()
    {
      SyncRoot = new object();
      FilePath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "Log\\";
      LogTask = new Thread(WriteLog);
      LogColQueue = new ThreadSafeQueueV2<string>();
      LogTask.Start();
      Debug.WriteLine("Log Start......");
    }
    /// <summary>
    /// 記錄日志
    /// </summary>
    /// <param name="msg">日志內容</param>
    public static void Log(string msg)
    {
      string _msg = string.Format("{0} : {2}", DateTime.Now.ToString("HH:mm:ss"), msg);
      LogColQueue.Enqueue(msg);
    }
    /// <summary>
    /// 記錄日志
    /// </summary>
    /// <param name="msg">日志內容</param>
    /// <param name="type">日志類型</param>
    public static void Log(string msg, LogType type)
    {
      string _msg = string.Format("{0} {1}: {2}", DateTime.Now.ToString("HH:mm:ss"), type, msg);
      LogColQueue.Enqueue(_msg);
    }
    /// <summary>
    /// 記錄日志
    /// </summary>
    /// <param name="ex">異常</param>
    public static void Log(Exception ex)
    {
      if (ex != null)
      {
        string _newLine = Environment.NewLine;
        StringBuilder _builder = new StringBuilder();
        _builder.AppendFormat("{0}: {1}{2}", DateTime.Now.ToString("HH:mm:ss"), ex.Message, _newLine);
        _builder.AppendFormat("{0}{1}", ex.GetType(), _newLine);
        _builder.AppendFormat("{0}{1}", ex.Source, _newLine);
        _builder.AppendFormat("{0}{1}", ex.TargetSite, _newLine);
        _builder.AppendFormat("{0}{1}", ex.StackTrace, _newLine);
        LogColQueue.Enqueue(_builder.ToString());
      }
    }
    private static void WriteLog()
    {
      while (true)
      {
        if (LogColQueue.Count() > 0)
        {
          string _msg = LogColQueue.Dequeue();
          Monitor.Enter(SyncRoot);
          if (!CreateDirectory()) continue;
          string _path = string.Format("{0}{1}.log", FilePath, DateTime.Now.ToString("yyyyMMdd"));
          Monitor.Exit(SyncRoot);
          lock (SyncRoot)
          {
            if (CreateFile(_path))
              ProcessWriteLog(_path, _msg);//寫入日志到文本
          }
          ProcessBackLog(_path);//日志備份
        }
      }
    }
    private static void ProcessBackLog(string path)
    {
      lock (SyncRoot)
      {
        if (FileToolV2.GetMBSize(path) > BackFileSize_MB)
        {
          FileToolV2.CopyToBak(path);
        }
      }
    }
    private static void ProcessWriteLog(string path, string msg)
    {
      try
      {
        StreamWriter _sw = File.AppendText(path);
        _sw.WriteLine(msg);
        _sw.Flush();
        _sw.Close();
      }
      catch (Exception ex)
      {
        Debug.WriteLine(string.Format("寫入日志失敗,原因:{0}", ex.Message));
      }
    }
    private static bool CreateFile(string path)
    {
      bool _result = true;
      try
      {
        if (!File.Exists(path))
        {
          FileStream _files = File.Create(path);
          _files.Close();
        }
      }
      catch (Exception)
      {
        _result = false;
      }
      return _result;
    }
    private static bool CreateDirectory()
    {
      bool _result = true;
      try
      {
        if (!Directory.Exists(FilePath))
        {
          Directory.CreateDirectory(FilePath);
        }
      }
      catch (Exception)
      {
        _result = false;
      }
      return _result;
    }

  }
}

測試代碼如下:

using CSharpUtilHelpV2;
using System;
using System.Diagnostics;
using System.Threading;

namespace LogUtilHelpV2Test
{
  class Program
  {
    static void Main(string[] args)
    {
      try
      {
        Debug.WriteLine("-------------");
        Action _writeLog = delegate()
        {
          for (int i = 0; i < 10000; i++)
            LogToolV2.Log(Guid.NewGuid().ToString(), LogType.Trace);
        };
        Thread _wireteLogTask1 = new Thread(new ThreadStart(_writeLog));
        _wireteLogTask1.Start();

        Thread _wireteLogTask2 = new Thread(new ThreadStart(_writeLog));
        _wireteLogTask2.Start();

        //throw new Exception("test  aaa bb cc");
      }
      catch (Exception ex)
      {
        LogToolV2.Log(ex);
        Console.WriteLine(ex.Message.Trim());
      }
      finally
      {
        Console.WriteLine("ok");
        Console.ReadLine();
      }
    }
  }
}

代碼運行效果如下所示:

感興趣的讀者可以自己測試運行一下,希望能對大家起到一點幫助!

相關文章

  • 詳解C#數(shù)據(jù)類型及其轉換

    詳解C#數(shù)據(jù)類型及其轉換

    這篇文章主要介紹了C#數(shù)據(jù)類型及其轉換詳解,在C#中,數(shù)據(jù)類型可以分為幾種類型,今天小編通過本文給大家詳細介紹,需要的朋友可以參考下
    2020-07-07
  • C#實現(xiàn)附件上傳和下載功能

    C#實現(xiàn)附件上傳和下載功能

    這篇文章主要介紹了C#實現(xiàn)附件上傳和下載功能,需要的朋友可以參考下
    2015-11-11
  • HTML文本框的值改變后觸發(fā)后臺代碼的方法

    HTML文本框的值改變后觸發(fā)后臺代碼的方法

    asp.net用日期插件,當選中一個日期時觸發(fā)一個事件,以查詢當前日期的數(shù)據(jù)。這是要跟數(shù)據(jù)庫交互的。先貼出控件代碼:
    2013-04-04
  • 使用C#開發(fā)OPC?Server服務器源碼解析

    使用C#開發(fā)OPC?Server服務器源碼解析

    OPC?Server服務器服務器的開發(fā)比較繁瑣,本示例采用C#提供了一種簡單快速實現(xiàn)OPCServer的方法,已經(jīng)在工程項目中應用,本文對C#開發(fā)OPC?Server服務器相關知識給大家介紹的非常詳細,需要的朋友參考下吧
    2022-06-06
  • C#實現(xiàn)設置電腦顯示器參數(shù)

    C#實現(xiàn)設置電腦顯示器參數(shù)

    這篇文章主要為大家詳細介紹了如何利用C#實現(xiàn)設置電腦顯示器參數(shù),文中的示例代碼講解詳細,對我們學習C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • unity 實現(xiàn)攝像機繞某點旋轉一周

    unity 實現(xiàn)攝像機繞某點旋轉一周

    這篇文章主要介紹了unity 實現(xiàn)攝像機繞某點旋轉一周,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Unity3D Shader實現(xiàn)貼圖切換效果

    Unity3D Shader實現(xiàn)貼圖切換效果

    這篇文章主要為大家詳細介紹了Unity3D Shader實現(xiàn)貼圖切換效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • C# DialogResult用法案例詳解

    C# DialogResult用法案例詳解

    這篇文章主要介紹了C# DialogResult用法案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • C# http系列之以form-data方式上傳多個文件及鍵值對集合到遠程服務器

    C# http系列之以form-data方式上傳多個文件及鍵值對集合到遠程服務器

    這篇文章主要介紹了C# http系列之以form-data方式上傳多個文件及鍵值對集合到遠程服務器,需要的朋友可以參考下
    2019-08-08
  • C#實現(xiàn)簡單的Http請求實例

    C#實現(xiàn)簡單的Http請求實例

    這篇文章主要介紹了C#實現(xiàn)簡單的Http請求的方法,以實例形式較為詳細的分析了C#實現(xiàn)Http請求的具體方法,需要的朋友可以參考下
    2015-01-01

最新評論