【.net】創建屬於自己的log組件——改進版


在上一篇隨筆中,建立了一個自己的Log簡單日志記錄類  

可是在眾多園友的提點下,對於線程,阻塞,資源競爭等都沒有仔細的去了解

在這版的改進中,我們新加了線程操作,線程等待,以及多層的錯誤捕獲。【不知道有什么用可是潛意識叫我加上】

這些改進用於——作為一個本分的Log,絕對不影響主線程的流程不阻塞,同時能應對多個日志寫入的要求,且避免資源的競爭。充分利用cpu的優勢,讓Log穩定的記錄。

 【歡迎順帶訪問我的github主頁】

改進之后的代碼

【感謝@Leandro的建議,再次修改之后的代碼】

using System;
using System.ComponentModel;
using System.IO;
using System.Threading;
using System.Threading.Tasks;

namespace CustomerLog
{
    /// <summary>
    /// 保存日志
    /// </summary>
    public class Loghelper
    {
        private static Mutex _mutex;
        static Loghelper()
        {
            _mutex = new Mutex();
        }

        #region 公開線程寫入日志
        /// <summary>
        /// 消息日志記錄
        /// </summary>
        /// <param name="message">消息</param>
        public void Log(string message)
        {
            try
            {
                new Task(() => Writelog(message)).Start();
            }
            catch
            {
                // ignored
            }
        }

        /// <summary>
        /// 錯誤日志記錄
        /// </summary>
        /// <param name="ex">錯誤</param>
        public void Log(Exception ex)
        {
            try
            {
                new Task(() => WriteBuglog(ex)).Start();
            }
            catch
            {
                // ignored
            }
        }

        #endregion

        #region 日志分類
        /// <summary>
        /// 保存普通日志
        /// </summary>
        /// <param name="message"></param>
        private bool Writelog(string message)
        {
            string logContent = string.Format("[{0}] =>{1}", DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"), message);
            return SetFile(@"Log.txt", logContent);
        }

        /// <summary>
        /// 保存錯誤信息日志
        /// </summary>
        /// <param name="ex"></param>
        private bool WriteBuglog(Exception ex)
        {
            var logContent = string.Format("[{0}]錯誤發生在:{1},\r\n 內容:{2}",
                DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"), ex.Source, ex.Message);
            logContent += string.Format("\r\n  跟蹤:{0}", ex.StackTrace);
            return SetFile(@"BugLog.txt", logContent);
        }
        #endregion

        #region 通用操作

        /// <summary>
        /// 標准化寫入過程,繼承之后可自定義寫入內容
        /// 默認保存在debug目錄的Log目錄下
        /// </summary>
        /// <param name="filename">文件名</param>
        /// <param name="logContent">寫入內容</param>
        private static bool SetFile(string filename, string logContent)
        {
            _mutex.WaitOne();
            try
            {
                Isexist(); // 判斷Log目錄是否存在
                string errLogFilePath = Environment.CurrentDirectory + @"\Log\" + filename.Trim();// 獲取當前目錄地址
                StreamWriter sw;
                if (!File.Exists(errLogFilePath))
                {
                    FileStream fs1 = new FileStream(errLogFilePath, FileMode.Create, FileAccess.Write);
                    sw = new StreamWriter(fs1);
                }
                else
                {
                    sw = new StreamWriter(errLogFilePath, true);
                }
                sw.WriteLine(logContent);
                sw.Flush();
                sw.Close();
                return true;
            }
            catch
            {
                // 忽略錯誤
                return false;
            }
            finally
            {
                _mutex.ReleaseMutex();
            }
        }

        // 判斷是否存在日志文件
        private static void Isexist()
        {
            string path = Environment.CurrentDirectory + @"\Log\";
            if (!File.Exists(path))
            {
                Directory.CreateDirectory(path);
            }
        }
        #endregion
    }
}

 

在新的代碼中取消了靜態的方法,在類初始化的時候實例一個控制線程的控制器。

 

OK修改過后的就這個了。有疑問的希望廣大園友能提出來,大家共同學習改進。

 

歡迎訪問我的個人主頁

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM