a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > 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久久影院 | 精品中文字幕一区二区三区 | 日本高清视频网站 | 青青艹在线视频 | 日本一级二级三级久久久 | 日本黄在线 | 国产激情在线视频 | 日本视频一区二区三区 | 久久韩剧网 | www.久久久精品 | 国产精品美乳一区二区免费 | 日本1区2区 | 亚洲成a人| 久久伦理电影网 | 国产a网站 | 久久精品国产亚洲一区二区三区 | 制服 丝袜 激情 欧洲 亚洲 | 亚洲精品视频一区二区三区 | 超碰97在线播放 | 久久国产一区 | 中文字幕第一区 | 国产精品成人一区二区 | 欧美怡红院视频一区二区三区 | 巨大黑人极品videos精品 | 日韩中文字幕在线观看 | 成人av入口| 日韩久久一区 | 午夜免费福利视频 | 成人免费小视频 | 欧美一区二区三区黄色 | 午夜精品偷拍 | 亚洲人成中文字幕在线观看 | 超碰香蕉 | 狠狠操网站 | 在线观看亚洲大片短视频 | 亚洲国产精品久久久男人的天堂 | 免费观看黄a一级视频 | av色资源 | 国产成人福利在线观看 | 国产精品二区一区二区aⅴ污介绍 | 一区二区三区欧美在线 |