最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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#如何實現(xiàn)子進程跟隨主進程關閉

    C#如何實現(xiàn)子進程跟隨主進程關閉

    多進程開發(fā)經(jīng)常會遇到主進程關閉,子進程需要跟隨主進程一同關閉,比如調ffmpeg命令行實現(xiàn)的錄屏程序等,下面我們就來看看C#是如何實現(xiàn)子進程跟隨主進程關閉的吧
    2024-04-04
  • C#實現(xiàn)影院售票系統(tǒng)

    C#實現(xiàn)影院售票系統(tǒng)

    這篇文章主要為大家詳細介紹了C#實現(xiàn)影院售票系統(tǒng),解析了售票系統(tǒng)的難點,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C#關鍵字async/await用法

    C#關鍵字async/await用法

    在本篇文章里小編給大家整理的是關于C#關鍵字async/await用法及相關實例,需要的朋友們學習下。
    2019-12-12
  • C#獲取文件名和文件路徑的兩種實現(xiàn)方式

    C#獲取文件名和文件路徑的兩種實現(xiàn)方式

    這篇文章主要介紹了C#獲取文件名和文件路徑的兩種實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 在C#中創(chuàng)建和讀取XML文件的實現(xiàn)方法

    在C#中創(chuàng)建和讀取XML文件的實現(xiàn)方法

    項目中需要將前臺頁面中的信息保存下來并存儲為xml文件格式到數(shù)據(jù)庫中去。因此我先在這里通過一個小實例來學習xml的創(chuàng)建與讀取
    2013-09-09
  • DevExpress TreeList 常見問題解決方法

    DevExpress TreeList 常見問題解決方法

    這篇文章主要介紹了DevExpress TreeList 常見問題解決方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-12-12
  • C#簡單的通用基礎字典實現(xiàn)方法

    C#簡單的通用基礎字典實現(xiàn)方法

    這篇文章主要介紹了C#簡單的通用基礎字典實現(xiàn)方法,包含了字典的索引、記錄、回調與查詢等技巧,需要的朋友可以參考下
    2014-12-12
  • C#將Excel轉成PDF的方法

    C#將Excel轉成PDF的方法

    今天小編就為大家分享一篇關于C#將Excel轉成PDF的方法,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • OpenXml讀寫Excel實例代碼

    OpenXml讀寫Excel實例代碼

    這篇文章主要介紹了OpenXml讀寫Excel代碼分享,大家參考使用
    2013-12-12
  • C#實現(xiàn)貪吃蛇小游戲

    C#實現(xiàn)貪吃蛇小游戲

    這篇文章主要為大家詳細介紹了C#實現(xiàn)貪吃蛇小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評論

宁陵县| 广宗县| 汉沽区| 淮南市| 新龙县| 景东| 遂川县| 同心县| 广宗县| 迭部县| 尚志市| 葵青区| 奇台县| 耿马| 扎鲁特旗| 朝阳区| 罗平县| 老河口市| 德兴市| 凤凰县| 西盟| 湘阴县| 勃利县| 运城市| 钦州市| 大兴区| 天长市| 文水县| 宁津县| 商洛市| 桐乡市| 和硕县| 交口县| 古田县| 阜南县| 平江县| 墨脱县| 岳普湖县| 谷城县| 钟山县| 开平市|