五邑隐俠,本名關健昌,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方法,在這裡把所有日志連接配接成字元串上傳到日志檔案伺服器,實作對異常日志的收集上報。
日志系統先說到這裡,下一篇我們将介紹下怎樣做消息分發。