C#實現日誌記錄 支援按日期多檔案儲存
阿新 • • 發佈:2018-11-10
日誌記錄類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()是建立日誌檔案。