Unity應用架構設計 13 日誌元件的實施

2022-01-23 22:00:25 字數 3070 閱讀 4039

對於應用程式而言,日誌是非常重要的功能,通過日誌,我們可以跟蹤應用程式的資料狀態,記錄crash的日誌可以幫助我們分析應用程式崩潰的原因,我們甚至可以通過日誌來進行效能的監控。總之,日誌的好處很多,特別是對release之後的線上版本進行異常的跟蹤。

而對於線上的版本,上述兩種除錯都不行,那我們怎麼來跟蹤資料呢?

從日誌的儲存分類上來看,可以分為四類:控制台,檔案系統,資料庫,第三方平台

為了可以更加靈活的跟蹤線上的變化,可以使用第三方的analysis,也可以自建日誌元件。我偏向於混合使用,所以接下來,談談乙個日誌元件的基本設計理念,如下圖所示:

從上圖可以看出,整個入口由工廠logfactory來建立logstrategy子類例項,logstrategy是個抽象的模板類,定義了公共的處理方法,但並不知道怎樣寫日誌(比如是寫入到資料庫呢還是到檔案),寫日誌的行為交給子類去完成。

有了日誌元件的設計圖,接下來就是將理念落實到行動,讓我們來實現它吧!

logfactory是乙個簡單工廠,封裝建立logstrategy物件的**。

public class logfactory

private readonly dictionary_strategies=new dictionary(),,

}; public logstrategy resolve() where t:logstrategy

}

logfactory內部定義了乙個字典,key為logstrategy子類的類名,value為具體的logstrategy物件。通過乙個公共介面resolve來獲取相關物件。

使用字典比switch..case更直觀,也更加容易擴充套件其他選項。更重要的是,不會對公共介面resolve進行修改。

logstrategy是乙個抽象類,即模板類。

它定義了乙個公共的api,即log。在方法log中,定義了一些對內容的公共操作,因為對於日誌來說,不管是記錄在資料庫還是檔案系統,都將對內容拼接上裝置型別、裝置名稱、作業系統、建立時間等基本資訊。

同時還定義了乙個抽象方法recordmessage,對於需要寫入的型別(檔案系統or資料庫or控制台)延遲到子類決定。

public abstract class logstrategy

/// /// 模板方法

///

protected abstract void recordmessage(string message);

protected abstract void setcontentwriter();

/// /// 公共的api

///

public void log(string message,bool verbose=false)

//抽象方法,交由子類實現

}private void recorddatetime()

private void recorddevicemodel()

private void recorddevicename()

private void recordoperatingsystem()

模板方法模式:在乙個方法中定義演算法的骨架,而將一些步驟延遲到子類。模板方法使得子類可以在不改變演算法的結構下,重新定義演算法中的某些步驟。

當在控制台debug時,我們其實不需要裝置型別,裝置名稱等資訊,故公共介面log提供了乙個開關verbose來開啟是否需要詳細資訊,預設為false,即關閉狀態。

繼承logstrategy,建立自定義的日誌策略

比如實現filelogstrategy,除了override了recordmessage方法之外,還需要提供乙個實現了icontentwriter介面的類,你可以直接在recordmessage方法中寫入日誌,但可能有一些公共的操作,比如在非同步執行緒,批量將10條資料寫到檔案或者資料庫中,所以提供乙個icontentwriter更加容易擴充套件。

public class filelogstrategy:logstrategy

protected sealed override void setcontentwriter()

protected override void recordmessage(string message)

}

建立乙個basecontentwriter,提供了公共的寫入方法,比如為了提高效能,檔案的io並不是馬上寫入檔案,而是批量flush。同樣資料庫記錄日誌也是一樣,像unit of work那樣,批量向資料庫寫入資料,提高它的吞吐率。

根據需求使用不同的日誌類

logfactory.instance.resolve().log("welcome");
不同於伺服器端的日誌元件,比如log4j,只需要將日誌寫在本地檔案系統中,客戶端的日誌相對來說複雜點,因為記錄的日誌是發生在使用者的客戶端,所以你必須要想辦法把日誌傳到伺服器,比如一些crash的異常。既然要把日誌發回來,在應用閃退時,必須能夠持久化到本地,故我們會將日誌寫到檔案系統或者資料庫,然後在合適的時候將日誌傳送到伺服器進行分析。當然,你也可以使用第三方的服務,比如友盟或者 unity analytics 來分析資料。

源**託管在github上,點選此了解

13 日誌檔案 重做日誌檔案

重做日誌檔案 redo log file 通常稱作日誌檔案,它是保證資料安全和資料庫備份與恢復的檔案。原理 重做記錄以迴圈的方式在sga 系統全域性區 區的重做日誌快取記憶體區中進行快取,並且由後台程序lgwr寫入到重做日誌檔案中。oracle對資料庫所做的修改首先儲存在記憶體中,這樣可以提高資料庫...

Unity應用架構設計 7 IoC工廠理念先行

一談到 ioc 有經驗的程式設計師馬上會聯想到控制反轉,將建立物件的責任反轉給工廠。ioc是依賴注入 di 的核心,大名鼎鼎的spring框架就是乙個非常卓越的的控制反轉 依賴注入框架。遺憾的是,我們顯然不能在unity 3d中去使用spring框架,但思想是相通的 ioc也好,控制反轉也罷,本質上...

unity模組與架構設計0 簡介

模組可以理解為乙個黑盒子,我們輸入進入a可以得到b.而不用關心黑盒子裡怎麼把a變成b的 這樣,我們把程式封裝成乙個個模組,組裝起來,可以大大減少 的耦合性.還可以重複利用 我們的程式在開始寫之前,一定要有乙個統一的規範和結構,這個就是架構.沒有架構的程式,維護成本高,穩定性差.有一些經典的程式設計模...