開發接口程序時,要保證程序穩定運行就要時刻監控接口程序發送和接收的數據,這就需要一個日志記錄的類將需要的信息記錄在日志文件中,便于自己維護接口程序。(Web系統也是如此,只是對應的日志實現比這個要復雜一點)。
剛開始考慮的比較少,沒有加入控制日志文件數量的功能。運行了一段時間,文件夾內的Log文件如下所示:

如果是這樣,那運行一年不就三百多個日志文件了,想一想這太可怕了。通過查找資料,發現.Net中的FileInfo存有文件的信息(包括名稱,創建時間,文件大小等),那就自己定義一個文件比較器實現文件按照名稱降序排序(采用降序是因為要保留近期的Log文件)。文件比較強實現的類如下所示:
using System;using System.Collections;using System.IO;namespace DotNetCommon.Logger{ /// <summary> /// 實現IComparer接口,實現文件按名稱降序排序 /// </summary> class FileSorter:IComparer { /// <summary> /// 繼承IComparer接口必須實現的方法 /// </summary> /// <param name="x">FileInfo文件x</param> /// <param name="y">FileInfo文件y</param> /// <returns></returns> public int Compare(object x, object y) { if (x == null && y == null) return 0; if (x == null) return -1; if (y == null) return 1; var xInfo = (FileInfo) x; var yInfo = (FileInfo) y; //按名稱降序排序 return String.Compare(yInfo.FullName, xInfo.FullName, StringComparison.Ordinal); } }}接下來就是實現日志文件自動刪除。具體思路是,當創建一個新的日志文件時,檢測是否超出最大日志允許數量。若超出,使用上面定義的比較器刪除之。日志自動刪除代碼方法如下:
/// <summary> /// 刪除Log目錄多余的日志文件 /// </summary> public void DeleteUnnecessaryLogFiles() { var path = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory + @"Log/"); var fileInfos = path.GetFiles("*.log"); Array.Sort(fileInfos, new FileSorter()); if (fileInfos.Length <= (_maxLogNum - 1)) return; for (var i = _maxLogNum - 1; i < fileInfos.Length; i++) { var filepath = fileInfos[i].FullName; if (!File.Exists(filepath)) continue; try { File.Delete(filepath); } catch (Exception) { return; } } }Log日志類具體代碼如下所示:
using System;using System.IO;using System.Text;namespace DotNetCommon.Logger{ /// <summary> /// 類說明:日志記錄(文本記錄和byte數組記錄) /// 編碼人:鞠小軍 /// 聯系方式:binghuojxj@QQ.com /// </summary> class Log { /// <summary> /// 程序當前目錄 /// </summary> PRivate readonly DirectoryInfo _dir = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory); /// <summary> /// 默認日志文件最大數量為20 /// </summary> private readonly int _maxLogNum = 20; /// <summary> /// 構造函數 /// </summary> /// <param name="maxLogNum">Log目錄下日志文件的最大數量</param> public Log(int maxLogNum) { _maxLogNum = maxLogNum; } /// <summary> /// 字符串寫入日志文件 /// </summary> /// <param name="msg">寫入的字符串文本</param> public void WriteLog_Txt(string msg) { FileStream stream = null; var sb = new StringBuilder(); var path = _dir + "Log"; if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } var str2 = path + @"/" + DateTime.Now.ToString("yyyy-MM-dd") + ".log"; sb.Append(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " "); sb.Append(msg); var bytes = Encoding.UTF8.GetBytes(sb + "/r/n"); try { if (!File.Exists(str2)) DeleteUnnecessaryLogFiles(); stream = File.OpenWrite(str2); stream.Position = stream.Length; stream.Write(bytes, 0, bytes.Length); } catch (Exception exception) { Console.WriteLine("文件打開失敗{0}", exception.Message); } finally { if (stream != null) stream.Close(); } } /// <summary> /// 字節數組寫入日志文件 /// </summary> /// <param name="msg">提示信息</param> /// <param name="data">字節數組</param> public void WriteLog_Bytes(string msg, byte[] data) { FileStream stream = null; var sb = new StringBuilder(); var path = _dir + @"/Log"; if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } var str2 = path + @"/" + DateTime.Now.ToString("yyyy-MM-dd") + ".log"; sb.Append(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " "); sb.Append(msg); foreach (var num in data) { sb.AppendFormat("{0:x2} ", num); } var bytes = Encoding.UTF8.GetBytes(sb + "/r/n"); try { if (!File.Exists(str2)) DeleteUnnecessaryLogFiles(); stream = File.OpenWrite(str2); stream.Position = stream.Length; stream.Write(bytes, 0, bytes.Length); } catch (Exception exception) { Console.WriteLine("文件打開失敗{0}", exception.Message); } finally { if (stream != null) stream.Close(); } } /// <summary> /// 刪除Log目錄多余的日志文件 /// </summary> public void DeleteUnnecessaryLogFiles() { var path = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory + @"Log/"); var fileInfos = path.GetFiles("*.log"); Array.Sort(fileInfos, new FileSorter()); if (fileInfos.Length <= (_maxLogNum - 1)) return; for (var i = _maxLogNum - 1; i < fileInfos.Length; i++) { var filepath = fileInfos[i].FullName; if (!File.Exists(filepath)) continue; try { File.Delete(filepath); } catch (Exception) { return; } } } }}當前日志類不夠完善,我還沒有加上文件超過固定大小(如超出2M)自動創建新文件等等必要的功能,后續會逐漸完善。大家有什么好建議,歡迎大家拍磚,哈哈。
新聞熱點
疑難解答