Unity——日志打印工具
一、日志工具功能
封装Debug类,需要实现功能:
1.控制所有日志是否打印;
2.除了Log,Warning,Error外,给更多日志种类(不同颜色);
3.格式化打印日志;
4.不定参数,自动拼接成字符串;
5.上传日志到服务器;
二、Logger类
1.控制日志打印
封装Debug中关于Log的方法;
使用静态方法,声明静态字段,控制log,warning,error是否打印;

Debug源码中Log方法有两个重载;

第二个参数context可以传参GameObject,Hierarchy或者Project窗口中的预制体,双击Console日志会直接跳转选中传入的游戏物体;
我们可以将这个方法合并,第二个参数默认空;

2.色彩打印
打印不同颜色使用富文本;
string.Format("<color={0}>{1}</color>",color,obj);
3.多参数拼接
之前使用Go语言的fmt.Println有个功能很好用,连续传多个参数自动拼接;
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);
}
//调用
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类中有收到日志消息触发的事件LogMessageReceived;
监听这个事件;如果日志开关为关闭状态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开始调用;
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类
开启协程上传日志文件;
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);
}
五、日志双击溯源问题
以上的代码有个很大的问题,现在我们双击不会回到调用Logger的地方,只会跳转到Logger类中调用Debug.Log的地方;
有个很简单的办法解决,将上面代码编译成dll;
另外查找源码也可以自己决定掉转位置;
具体方法,通过反射获日志取栈信息,根据Logger类返回的栈信息路径,筛选出要跳转的位置;
通过官方提供的方法跳转到相应位置;
UnityEditorInternal.InternalEditorUtility.OpenFileAtLineExternal(string filename, int line);
六、调用
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");
}

Unity——日志打印工具的更多相关文章
- android开发必备日志打印工具类
今天给大家献上一款好用的日志打印工具.大家在平时的开发中用的最多的可能就是Log.i("",""),Log.e("","" ...
- Django 日志输出及打印--logging
Django使用python自带的logging作为日志打印工具. logging是线程安全的,主要分为4部分: Logger 用户使用的直接接口,将日志传递给Handler Handler 控制日志 ...
- Django之logging日志
简介 Django使用python自带的logging 作为日志打印工具.简单介绍下logging. logging 是线程安全的,其主要由4部分组成: Logger 用户使用的直接接口,将日志传递给 ...
- Unity 游戏框架搭建 (八) 减少加班利器-QLog
为毛要实现这个工具? 在我小时候,每当游戏到了测试阶段,交给QA测试,QA测试了一会儿拿着设备过来说游戏闪退了....当我拿到设备后测了好久Bug也没有复现,排查了好久也没有头绪,就算接了Bugly拿 ...
- 工作经验(Unity篇)
我的工作是C++开发,主要是做底层,其中绝大部分是给Unity调用的,以下是我的脚印,希望不会重蹈覆辙 Unity具有强大的跨平台性,但是使用到库文件不尽相同,例如Android中就使用so库文件,W ...
- Django—logging日志
简介 Django使用python自带的logging 作为日志打印工具.简单介绍下logging. logging 是线程安全的,其主要由4部分组成: Logger 用户使用的直接接口,将日志传递给 ...
- dubbo traceId透传实现日志链路追踪(基于Filter和RpcContext实现)
一.要解决什么问题: 使用elk的过程中发现如下问题: 1.无法准确定位一个请求经过了哪些服务 2.多个请求线程的日志交替打印,不利于查看按时间顺序查看一个请求的日志. 二.期望效果 能够查看一个请求 ...
- (20160604)开源第三方学习之CocoaLumberjack
CocoaLumberjack是一个很好用的日志打印工具,它可以帮助我们把工程中的日志信息打印到终端或者输出到文件中. 地址:https://github.com/CocoaLumberjack/Co ...
- 一个千万量级的APP使用的一些第三方库
转载:http://www.jianshu.com/p/dc8c05cf693d .背景 前段时间在调研第三方推送服务的时候,反编译了一部分市面上比较流行的APP.其中一个无论是在设计还是功能上都堪称 ...
随机推荐
- 【LeetCode】125. Valid Palindrome 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 列表生成式 正则表达式 双指针 日期 题目地址:https:/ ...
- 【LeetCode】590. N-ary Tree Postorder Traversal 解题报告 (C++&Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 迭代 相似题目 参考资料 日期 题目地址:htt ...
- FAT
目录 概 主要内容 代码 Zhang J., Xu X., Han B., Niu G., Cui L., Sugiyama M., Kankanhalli M. Attacks which do n ...
- Kernel PCA for Novelty Detection
目录 引 主要内容 的选择 数值实验 矩形框 spiral 代码 Hoffmann H. Kernel PCA for novelty detection[J]. Pattern Recognitio ...
- [c++]关于指针的一些问题记录
const char* 和char* 之间的转换 const char*是指向常量的指针,而不是指针本身为常量,可以不被初始化.该指针可以指向常量也可以指向变量,只是从该指针的角度而言,它所指向的是常 ...
- k8s loadbalancer与ingress实践
k8s可以通过三种方式将集群内服务暴露到外网,分别是NodePort.LoadBalancer.Ingress,其中NodePort作为基础通信形式我们在<k8s网络模型与集群通信>中进行 ...
- pod运行到指定node节点
利用labels 1.一般来说都每个节点有自己特有的labels 比如 2.利用nodeSelector nodeSelector: kubernetes.io/hostname: master3 ...
- Gitlab如何进行备份恢复与迁移?
https://blog.csdn.net/ouyang_peng/article/details/77070977 1.Gitlab 创建备份 1.1 创建备份文件 首先我们得把老服务器上的Gitl ...
- Centos7 查看文件命令总结
ls命令 ls -d --文件或者目录是否存在 ls -l 或者ll --显示详细信息 ls -lt --文件按时间顺序排序(升序) ls -ltr --按时间倒叙排序 ls -i --显示索引节点 ...
- react中prop-types的使用
什么是prop-types?prop代表父组件传递过来的值,types代表类型.简单来说就是用来校验父组件传递过来值的类型 import PropTypes from 'prop-types'; To ...