亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#實現線程安全的簡易日志記錄方法

2020-01-24 02:36:13
字體:
來源:轉載
供稿:網友

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

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();      }    }  }}

代碼運行效果如下所示:

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人精品免高潮费视频| 亚洲欧洲日产国码av系列天堂| 国产精品久久久久久久久男| 精品亚洲夜色av98在线观看| 最好看的2019的中文字幕视频| 国产精品第3页| 91影院在线免费观看视频| 久久电影一区二区| 精品久久久久久中文字幕| 精品美女国产在线| 91在线视频精品| 欧美性猛交xxxx乱大交蜜桃| 亚洲人成网站777色婷婷| 亚洲欧洲黄色网| 亚洲综合中文字幕在线观看| 日韩最新在线视频| 久热精品在线视频| 欧美巨猛xxxx猛交黑人97人| 精品国产一区av| 91视频免费网站| 97欧美精品一区二区三区| 欧美日韩视频在线| 黑人巨大精品欧美一区二区免费| 日韩视频免费大全中文字幕| 亚洲专区中文字幕| 国产精品男女猛烈高潮激情| 久久久91精品国产一区不卡| 欧美性极品少妇精品网站| 91成人精品网站| 久久精品视频亚洲| 久久精品夜夜夜夜夜久久| 国产福利精品av综合导导航| 亚洲一区中文字幕在线观看| 国产精品自拍小视频| 91老司机精品视频| 亚洲欧美日韩精品| 久久久久久国产精品三级玉女聊斋| 亚洲欧美制服中文字幕| 成人中文字幕+乱码+中文字幕| 黄网站色欧美视频| 欧美日韩成人免费| 亚洲黄色av女优在线观看| 久久国产精品久久久久| 91免费视频国产| 国产精品狼人色视频一区| 国产精品网站视频| 欧美成人剧情片在线观看| 国内精品久久影院| 欧美成人精品在线观看| 2020久久国产精品| 成人女保姆的销魂服务| 在线观看日韩www视频免费| 高清在线视频日韩欧美| 一区二区三区天堂av| 精品亚洲国产成av人片传媒| 国产精品久久久久久久久久尿| 在线观看精品国产视频| 久久手机精品视频| 在线观看日韩av| 欧美激情中文字幕在线| 国产一区二区黑人欧美xxxx| 亚洲毛片在线观看.| 亚洲美女视频网| 中文字幕成人精品久久不卡| 欧美日韩另类字幕中文| 欧美日韩性视频在线| 久久久久久久爱| 国内外成人免费激情在线视频| 一区二区欧美久久| 日本一本a高清免费不卡| 中日韩美女免费视频网站在线观看| 九九热r在线视频精品| 亚洲国产高清高潮精品美女| 精品亚洲国产视频| 国产在线不卡精品| 欧美激情小视频| 国产精品狼人色视频一区| 国产亚洲人成网站在线观看| 国产欧美精品一区二区三区-老狼| 国产情人节一区| 亚洲网址你懂得| 国产福利视频一区| 国产区亚洲区欧美区| 国产精品久久久久久久7电影| 欧美成人免费播放| 国产精品一二区| 日韩黄色在线免费观看| 日韩中文字幕在线播放| 欧美日本啪啪无遮挡网站| 国产噜噜噜噜噜久久久久久久久| 欧美尤物巨大精品爽| 欧美成人一区二区三区电影| 国产日韩综合一区二区性色av| 亚洲xxxx做受欧美| 性欧美办公室18xxxxhd| 亚洲另类图片色| 国产一区二区精品丝袜| 欧日韩不卡在线视频| 96精品久久久久中文字幕| 欧美成人手机在线| 久久久91精品| 成人av电影天堂| 亚洲国产欧美在线成人app| 久久99热这里只有精品国产| 在线播放日韩av| 亚洲精品一区二三区不卡| 青青青国产精品一区二区| 成人精品在线视频| 亚洲va久久久噜噜噜久久天堂| 久久久99久久精品女同性| 欧美大片在线看免费观看| 国产一区二区色| 性色av一区二区三区| 亚洲激情国产精品| 最近2019年日本中文免费字幕| 国内精品视频在线| 久久国产精品99国产精| 国产精品一区电影| 91精品视频免费看| 欧美性极品xxxx做受| 97国产精品人人爽人人做| 欧美国产日韩中文字幕在线| 国产精品久久久久久网站| 俺也去精品视频在线观看| 亚洲高清一区二| 国产在线观看一区二区三区| 九九久久综合网站| 成人性生交大片免费看小说| 日本精品一区二区三区在线| 欧美国产在线视频| 国产成人精品视| 国产欧美一区二区三区四区| 亚洲欧美日韩一区二区在线| 国产精品久久久久久av| 久99九色视频在线观看| 久久久亚洲精选| 国产成人精品免费视频| 成人黄色片网站| 国产精品久久久久久久久借妻| 伊人伊成久久人综合网站| 九九视频直播综合网| 91香蕉电影院| 国产欧美精品xxxx另类| 欧美日韩不卡合集视频| 亚洲新声在线观看| 久久久午夜视频| 日本亚洲精品在线观看| 国产精品女人久久久久久| 国产一区在线播放| 亚洲午夜精品久久久久久性色| 777777777亚洲妇女| 亚洲精品一区在线观看香蕉| 琪琪第一精品导航| 国产日韩在线观看av| 日韩av在线免费播放| 欧美激情中文网| 国产日韩亚洲欧美| 日产精品99久久久久久| 岛国精品视频在线播放| 亚洲一区二区三区777| 国产精品久久久久久五月尺| 北条麻妃一区二区三区中文字幕| 国产亚洲精品久久久久久牛牛| 欧美一级大片在线免费观看|