cocos creator主程入門教程(五)—— 日誌系統
五邑隱俠,本名關健昌,10年遊戲生涯,現隱居五邑。本系列文章以TypeScript為介紹語言。
這一篇介紹日誌系統的設計。一般我們開發一個demo,只會簡單的用cocos提供的cc.log列印下日誌,方便除錯功能。但是要開發一個商業專案,還要考慮怎麼收集日誌,方便產品上線後定位線上問題。如果線上產品執行出異常時能把當時的上下文日誌發到一個檔案伺服器,有利於分析異常的原因。例如如果有通訊資料日誌,可以先判斷是後端返回資料異常,還是前端邏輯出問題。因此,我會在專案裡設計一個統一的日誌系統,遊戲裡所有日誌的列印都使用該日誌系統進行列印。
首先對日誌進行分級
/** * 日誌等級列舉 */ export enum LogLv { DEBUG = 0, INFO, WARN, ERROR }
除錯和內部測試時開啟所有等級的日誌,上線後只打開info等級以上的日誌。
產品上線後,日誌需要快取,在異常發生時進行上報
private static MAX_LEN: number = 5000; private static CLEAR_COUNT: number = 1000; private static logs: Array<LogInfo> = [];
這裡設定一個清理的條數,當快取達到上限,把指定條數的舊日誌清理出去。當然也可以使用連結串列實現的佇列或環形buffer快取,達到上限後只替換一條。
每次呼叫列印方法時,根據設定的日誌等級進行攔截,如果列印等級小於輸出等級,不做輸出。每個列印都可以新增tag,方便日誌排查時根據模組定位問題。
/** * 收集、列印除錯等級的日誌 * @param tag * @param msg */ public static debug(tag: string, msg: string): void { if (Logger.level > LogLv.DEBUG) { return; } let logMsg = "[DEBUG] [" + tag + "] " + msg; Logger._addLog(LogLv.DEBUG, logMsg); cc.log(logMsg); }
日誌快取處理
/** * 新增快取日誌 * @param level * @param logMsg */ private static _addLog(level: LogLv, logMsg: string): void { if (Logger.logs.length >= Logger.MAX_LEN) { Logger.logs.splice(0, Logger.CLEAR_COUNT); } Logger.logs.push({ level: level, msg: logMsg }); }
對於網頁版本,可以實現window.onerror方法,在這裡把所有日誌連線成字串上傳到日誌檔案伺服器,實現對異常日誌的收集上報。
日誌系統先說到這裡,下一篇我們將介紹下怎樣做訊息分發。