大叔也說Xamarin~Android篇~日(ri)志(zhi)的(de)記錄
無論哪個平臺,開(kai)始哪種應(ying)用程序,日志(zhi)總是少(shao)不(bu)了(le)的(de)(de)(de),大(da)家在Lind.DDD里也(ye)可以看到大(da)叔(shu)的(de)(de)(de)日志(zhi)組(zu)件,而(er)在xamarin進行移動開(kai)發時(shi),為了(le)更(geng)好的(de)(de)(de)調試,記錄運行的(de)(de)(de)情況,日志(zhi)也(ye)是必須的(de)(de)(de),這講主要說一下在xamarin for android開(kai)發時(shi),日志(zhi)組(zu)件的(de)(de)(de)實現(xian)。
對于android平臺(tai)有(you)自己的(de)日(ri)(ri)志(zhi)組件,它(ta)主要(yao)在輸(shu)(shu)出窗口(kou)進行(xing)輸(shu)(shu)出,而我們有(you)時(shi)需要(yao)它(ta)將日(ri)(ri)志(zhi)寫入(ru)到磁盤,對于手機可以是sdCard等,這時(shi)就需要(yao)我們自己封裝(zhuang)一個(ge)日(ri)(ri)志(zhi)組件了。
依舊面向對象的設計
上面是(shi)在Android的綁定類(lei)庫里(li)建立的日志組件,我(wo)們的Jar原生組件也(ye)可(ke)以放在這個綁定類(lei)庫項目里(li),以后在開發時,直接引用這個項目即可(ke)
被簡化了個日志行為和級別
/// <summary> /// 日志功能接口規范 /// </summary> public interface ILogger { #region 級別日志 /// <summary> /// 將message記錄(lu)到日(ri)志文件 /// </summary> /// <param name="message"></param> void Logger_Info(string message); /// <summary> /// 異常發生的日志 /// </summary> /// <param name="message"></param> void Logger_Error(Exception ex); /// <summary> /// 調試期間的日志 /// </summary> /// <param name="message"></param> void Logger_Debug(string message); /// <summary> /// 引起程序(xu)終止的日(ri)志 /// </summary> /// <param name="message"></param> void Logger_Fatal(string message); /// <summary> /// 引起警告的日志 /// </summary> /// <param name="message"></param> void Logger_Warn(string message); #endregion }
/// <summary> /// 日(ri)志級(ji)別:DEBUG|INFO|WARN|ERROR|FATAL|OFF /// </summary> internal enum Level { /// <summary> /// 記(ji)錄DEBUG|INFO|WARN|ERROR|FATAL級(ji)別的日志 /// </summary> DEBUG, /// <summary> /// 記錄(lu)INFO|WARN|ERROR|FATAL級(ji)別的日志 /// </summary> INFO, /// <summary> /// 記錄WARN|ERROR|FATAL級別的日志(zhi) /// </summary> WARN, /// <summary> /// 記(ji)錄(lu)ERROR|FATAL級別(bie)的(de)日志 /// </summary> ERROR, /// <summary> /// 記錄FATAL級別(bie)的(de)日志 /// </summary> FATAL, /// <summary> /// 關閉日志功能 /// </summary> OFF, }
LoggerBase作(zuo)為日志實(shi)現的基類,在Lind.DDD中已經介紹過,這里只說一下文件路徑的選擇,android與pc有些不(bu)同,因為前(qian)者有sd卡的概念
/// <summary> /// 日志文件(jian)地址 /// 沒有(you)sdCard則存儲到手(shou)機上 /// </summary> protected string FileUrl { get { if (Android.OS.Environment.GetExternalStorageState(Android.OS.Environment.RootDirectory).Equals( Android.OS.Environment.MediaMounted)) return "/" + Android.OS.Environment.MediaMounted; else return "/Logger"; } }
單例模式,讓你的程序只建立一次日志實例對象
這里(li)只有(you)一個日(ri)志實現方式(shi)我就(jiu)寫死了,日(ri)后有(you)多種(zhong),可以寫在配置里(li)
/// <summary> /// 日志生產類 /// Singleton模(mo)(mo)式和策略模(mo)(mo)式和工廠模(mo)(mo)式 /// </summary> public sealed class LoggerFactory : ILogger { #region Logger有多種實現時,需要使用Singleton模式 /// <summary> /// 對外不(bu)能創建類的實例 /// </summary> private LoggerFactory() { string type = "file"; switch (type) { case "file": iLogger = new NormalLogger(); break; default: throw new ArgumentException("請正確(que)配(pei)置AppSetting的(de)LoggerType節點(file,log4net,mongodb)"); } } /// <summary> /// 日志(zhi)級別 /// </summary> private static Level level = Level.DEBUG; /// <summary> /// 線程(cheng)鎖 /// </summary> private static object lockObj = new object(); /// <summary> /// 日志工廠 /// </summary> private static LoggerFactory instance; /// <summary> /// 日志(zhi)提供者,只(zhi)在本類(lei)中實(shi)例化 /// </summary> private ILogger iLogger; /// <summary> /// 單例模式(shi)的日志工廠(chang)對象 /// </summary> public static LoggerFactory Instance { get { if (instance == null) { lock (lockObj) { if (instance == null) { instance = new LoggerFactory(); } } } return instance; } } #endregion #region ILogger 成員 public void Logger_Debug(string message) { if (level <= Level.DEBUG) iLogger.Logger_Debug(message); } public void Logger_Info(string message) { if (level <= Level.INFO) iLogger.Logger_Info(message); } public void Logger_Warn(string message) { if (level <= Level.WARN) iLogger.Logger_Warn(message); } public void Logger_Error(Exception ex) { if (level <= Level.ERROR) iLogger.Logger_Error(ex); } public void Logger_Fatal(string message) { if (level <= Level.FATAL) iLogger.Logger_Fatal(message); } #endregion }
程序在運行之后,我們觀察sdcard的(de)根(gen)目錄,日(ri)志已經存(cun)在了
日志內容是(shi)我(wo)們進行(xing)格式(shi)化之后的,感覺還是(shi)比較清晰的
從上(shang)面的圖中可以看(kan)到,我們的日志(zhi)級(ji)別Info,Error也都體現出來了。