详解Unity日志打印工具功能
作者:小紫苏 发布时间:2022-03-27 09:34:19
一、日志工具功能
封装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");
}
工具类下载
来源:https://www.cnblogs.com/littleperilla/p/15854027.html


猜你喜欢
- 面试的时候被问到,如何遍历System.drawing.Color下面的所有颜色以及名称以查看,当时答得不好,现将方案记录如下:View C
- SpringTask是Spring自带的功能。实现起来比较简单。使用SpringTask实现定时任务有两种方式:1.注解方式基于注解@Sch
- java超市管理系统 1.0(含源文件,后续会继续优化~)前言一个月零零散散的时间学习了java,通过这次“超市管理系统”的练习,希望可以给
- WPF 如何实现简单放大镜框架使用.NET40;Visual Studio 2019;实现此功能需要用到 VisualBrush&
- 公司的服务器需要实时监控,而且当用户空间已经满了,操作失败,或者出现程序Exception的时候就需要实时提醒,便于网管和程序员调式,这样就
- 1.非静态成员变量当成员变量为非静态成员变量且对当前类进行实例化时,将会产生死循环例子:public class ConstructorCl
- 前言众所周知,随着Google I/O大会的召开,Google宣布将支持Kotlin作为Android的开发语言,最近几日,关于Kotlin
- 一、Widget设计步骤需要修改三个XML,一个class:1.第一个xml是布局XML文件(如:main.xml),是这个widget的。
- 第一种方法:同步代码块:作用:把出现线程安全的核心代码上锁原理:每次只能一个线程进入,执行完毕后自行解锁,其他线程才能进来执行锁对象要求:理
- 本文实例讲述了Android TextView中文字通过SpannableString设置属性的方法。分享给大家供大家参考,具体如下:在An
- 一、隐藏标题栏 //隐藏标题栏 &
- springboot sqlSessionFactoryBean自定义1.新建一个配置类,加上configuration注解2.定制化Sql
- 这篇文章主要介绍了java实现上传文件类型检测过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 1、修改全局配置文件(application.yml)server: port: 9001 servlet: &nb
- 缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例。这样做可以减少系统开销,提高系统效率
- 前言如果在开发过程中,你还在靠查看服务器日志来寻找服务与服务之间的报错信息,那么这篇一定要来看下,通常在我们开发环境自测的时候,我们会将代码
- 我只给出比较有效的,方便的打印方法,有些WEB打印是调用ActiveX控件的,这样就需要用户去修改自己IE浏览器的Interne
- 一、负载均衡负载均衡(Load Balance): 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞
- 本文实例为大家分享了C#实现网页画图的具体代码,供大家参考,具体内容如下代码贴着保存下using System;using System.C
- 这篇文章主要介绍了Spring案例打印机的实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋