国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

[C#]簡易日志記錄,線程安全

2019-11-14 16:31:58
字體:
來源:轉載
供稿:網友

在實際項目開發中,會涉及日志記錄問題,比較常用的有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();            }        }    }}

代碼效果:

image

才疏學淺,如有紕漏,敬請指出,希望有所幫助!謝謝 大笑


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永年县| 万载县| 黄冈市| 佛山市| 延寿县| 横山县| 伊川县| 富川| 卢湾区| 仪征市| 淅川县| 黑水县| 海南省| 舟山市| 曲阳县| 美姑县| 虞城县| 中卫市| 叙永县| 交城县| 临城县| 武穴市| 柳江县| 姚安县| 新宾| 西盟| 资阳市| 德昌县| 新龙县| 赤水市| 安陆市| 东台市| 阳高县| 砚山县| 宜黄县| 梁河县| 云南省| 江川县| 成武县| 西青区| 梅河口市|