1. 程式人生 > >C#實現日誌記錄 支援按日期多檔案儲存

C#實現日誌記錄 支援按日期多檔案儲存

日誌記錄類LogHelper,支援按照日期儲存,儲存的資訊帶時間資訊,具體的日誌內容如下:

2016-12-08 23:56:45:787 [Notice]sadfsafasfffffffffffffffffffffffffffffffffffffffff

2016-12-08 23:56:45:787 [Notice]sadfsafasfffffffffffffffffffffffffffffffffffffffff

2016-12-08 23:56:45:787 [Notice]sadfsafasfffffffffffffffffffffffffffffffffffffffff

2016-12-08
23:56:45:787 [Notice]sadfsafasfffffffffffffffffffffffffffffffffffffffff 2016-12-08 23:56:45:787 [Notice]sadfsafasfffffffffffffffffffffffffffffffffffffffff 2016-12-08 23:56:45:787 [Notice]sadfsafasfffffffffffffffffffffffffffffffffffffffff

具體實現方式是建立一個佇列存放要寫入到檔案中的資料,在一個Task裡面把內容再寫入檔案中。寫入檔案的方式是寫入檔案時開啟檔案寫完後關閉檔案,如果採用把檔案開啟一直寫入的方式,在使用其他程式開啟檔案時會造成檔案被另外一個程序使用的問題。
Task中在一個While迴圈內從佇列取資料寫入檔案,如果沒有就Sleep,程式碼如下:

        void WriteLogFunc()
        {
            while(true)
            {
                if (CurrentLogCount() > 0)
                {
                    string strWriteLog = GetLog();
                    WriteLogToFile(strWriteLog);
                }
                else
                    Thread
.Sleep(1000); } }

寫檔案的程式碼如下:

        void WriteLogToFile(string writeLog)
        {
            if (!IsDirectoryExist())
                return;
            if (!IsLastFileExist())
                return;
            string writeFilePath = dicPath + "\\" + FileList.Last();
            if(IsLogContentOutOfSize(writeFilePath,writeLog))
            {
                if(!IsCreateLogFile(ref writeFilePath))
                {
                    return;
                }
            }
            FileStream fstream = null;
            StreamWriter streamWriter = null;
            try
            {
                fstream = new FileStream(writeFilePath,FileMode.Append,FileAccess.Write,FileShare.ReadWrite);
                streamWriter = new StreamWriter(fstream,Encoding.UTF8);
                streamWriter.WriteLine(writeLog);
                streamWriter.Flush();
            }
            catch(Exception e)
            {

            }
            finally
            {
                streamWriter?.Close();
                fstream?.Close();
            }
        }

IsLogContentOutOfSize()是判斷寫入的內容有沒有超過檔案大小限制,IsLastFileExist()是判斷日誌資料夾中是否由日誌檔案,IsCreateLogFile()是建立日誌檔案。

程式碼下載