網(wǎng)站首頁 編程語言 正文
一、日志工具功能
封裝Debug類,需要實現(xiàn)功能:
1.控制所有日志是否打印;
2.除了Log,Warning,Error外,給更多日志種類(不同顏色);
3.格式化打印日志;
4.不定參數(shù),自動拼接成字符串;
5.上傳日志到服務器;
二、Logger類
1.控制日志打印
封裝Debug中關于Log的方法;
使用靜態(tài)方法,聲明靜態(tài)字段,控制log,warning,error是否打印;
Debug源碼中Log方法有兩個重載;
第二個參數(shù)context可以傳參GameObject,Hierarchy或者Project窗口中的預制體,雙擊Console日志會直接跳轉(zhuǎn)選中傳入的游戲物體;
我們可以將這個方法合并,第二個參數(shù)默認空;
2.色彩打印
打印不同顏色使用富文本;
string.Format("<color={0}>{1}</color>",color,obj);
3.多參數(shù)拼接
之前使用Go語言的fmt.Println有個功能很好用,連續(xù)傳多個參數(shù)自動拼接;
public static void Log(params object[] messags) { if (!s_debugLogEnable) return; string message = string.Empty; foreach (var it in messags) { message += it.ToString(); } Debug.Log(message, null); } //調(diào)用 Logger.Log("Net error:",error,"msgId:",msgId);
4.格式化打印
格式化打印封裝原本Debug.LogFormat方法;
public static void LogFormat(string format, params object[] args) { if (!s_debugLogEnable) return; Debug.LogFormat(format, args); }
三、LoggerMgr類
繼承MonoBehavior的單例;
初始化Logger中的三個控制打印的字段;
Application類中有收到日志消息觸發(fā)的事件LogMessageReceived;
監(jiān)聽這個事件;如果日志開關為關閉狀態(tài)return;
if (isOpenLog) { Logger.s_debugLogEnable = true; Logger.s_warningLogEnable = true; Logger.s_errorLogEnable = true; } Application.logMessageReceived += (string condition, string stackTrace, LogType type) => { switch (type) { case LogType.Log: { if (!Logger.s_debugLogEnable) return; } break; case LogType.Warning: { if (!Logger.s_warningLogEnable) return; } break; case LogType.Error: { if (!Logger.s_errorLogEnable) return; } break; } };
四、上傳日志
LoggerMgr中初始化上傳日志信息;
方法寫在logger中,在LoggerMgr開始調(diào)用;
public static void Init(string url) { LogUploader.SetUploadUrl(url); // 日期 var t = System.DateTime.Now.ToString("yyyyMMddhhmmss"); s_logFileSavePath = string.Format("{0}/output_{1}.log", Application.persistentDataPath, t); Application.logMessageReceived += OnLogCallBack; }
OnLogCallBack方法中將日志和棧信息存儲成文件,等待上傳;
private static void OnLogCallBack(string condition, string stackTrace, LogType type) { s_logStr.Append(condition); s_logStr.Append("\n"); s_logStr.Append(stackTrace); s_logStr.Append("\n"); if (s_logStr.Length <= 0) return; if (!File.Exists(s_logFileSavePath)) { var fs = File.Create(s_logFileSavePath); fs.Close(); } using (var sw = File.AppendText(s_logFileSavePath)) { sw.WriteLine(s_logStr.ToString()); } s_logStr.Remove(0, s_logStr.Length); }
LogUploader類
開啟協(xié)程上傳日志文件;
public static void StartUploadLog(string logFilePath, string desc) { if (LOG_UPLOAD_URL == string.Empty) return; var go = new GameObject("LogUploader"); var bhv = go.AddComponent<LogUploader>(); bhv.StartCoroutine(bhv.UploadLog(logFilePath, LOG_UPLOAD_URL, desc)); }
在Logger類中同樣封裝上面的方法,所有的日志都通過Logger打印;
public static void UploadLog(string desc) { LogUploader.StartUploadLog(s_logFileSavePath, desc); }
五、日志雙擊溯源問題
以上的代碼有個很大的問題,現(xiàn)在我們雙擊不會回到調(diào)用Logger的地方,只會跳轉(zhuǎn)到Logger類中調(diào)用Debug.Log的地方;
有個很簡單的辦法解決,將上面代碼編譯成dll;
另外查找源碼也可以自己決定掉轉(zhuǎn)位置;
具體方法,通過反射獲日志取棧信息,根據(jù)Logger類返回的棧信息路徑,篩選出要跳轉(zhuǎn)的位置;
通過官方提供的方法跳轉(zhuǎn)到相應位置;
UnityEditorInternal.InternalEditorUtility.OpenFileAtLineExternal(string filename, int line);
六、調(diào)用
void Start() { Logger.Log("aaaa"); Logger.LogFormat("{0}===={1}",111,0.232); Logger.LogGreen("bbbb"); Logger.LogError("log error"); Logger.Log("aa", 13, "fff",16,"sfddf",64654); Logger.UploadLog("NetWork LogTest"); }
原文鏈接:https://www.cnblogs.com/littleperilla/p/15854027.html
相關推薦
- 2024-03-20 解決npm install遇到的問題:Error while executing:
- 2023-06-19 C++中的策略模式淺析_C 語言
- 2022-01-18 解決CSRF verification failed. Request aborted.的問題
- 2022-06-25 JQuery獲取對象的方式介紹_jquery
- 2021-12-13 VS在調(diào)試時,查看是DEBUG/RELEASE
- 2022-04-26 python?logging多進程多線程輸出到同一個日志文件的實戰(zhàn)案例_python
- 2023-07-15 es6中export和export default的區(qū)別
- 2022-04-24 Pygame?Surface創(chuàng)建圖像的實現(xiàn)_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支