详解Unity日志打印工具功能

目录
  • 一、日志工具功能
  • 二、Logger类
  • 三、LoggerMgr类
  • 四、上传日志
  • 五、日志双击溯源问题

一、日志工具功能

封装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日志打印工具的文章就介绍到这了,更多相关Unity日志打印内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Unity3D在Preview中打印日志的方法

    Preview窗口除了可以预览模型之外,我们还可以做别的操作. 今天我们来写个小工具在Preview窗口中显示调试信息. 可以看下面的图,同样是打印 health 和 power 的日志,在 Preview 中显示比在 Console 中显示舒服多了. 左边是Console中显示,右边是Preview窗口中显示. 创建Editor目录,然后把下面的脚本放进去 using UnityEngine; using UnityEditor; [CustomEditor(typeof(Object), t

  • 详解Unity日志打印工具功能

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

  • 详解Unity 实现语音识别功能

    现在语音识别已经被广泛的应用到各个领域中,在Unity开发中,语音识别也非常受欢迎.大部分人都会选择科大讯飞的语音识别功能,但是在一些小的项目中,使用科大讯飞的就有点大材小用了.今天就介绍一下Unity自带的语音识别功能.说是语音识别,其实unity本身还是做不到的,Unity自带的语音识别功能其实是关键字识别.比如我在Unity中设定好一句话汇总的几个关键词.当我再说这句话的时候就会和识别到.经过测试发现当一句话中有八个关键字,这句话就会非常好的被识别出来. 接下来就一起来实现一下: 首先贴一

  • log4j 详解异步日志的配置和测试

     log4j 详解异步日志的配置和测试 日志可以帮助我们分析故障原因,做些数据挖掘的工作.最简单的日志方法,就是自己写个写文件的方法,在需要打日志的时候调用下,但是这显然不可能在实际工程上用.还有个问题,就是频繁地打日志,会增加磁盘I/O,使得系统性能下降.这里用log4j这个库来部署一个含有日志管理的轻量级的系统,主要支持日志的异步写和等级分类的功能,完成最低限度的日志需求. 首先,我们建立一个Maven工程,并且在pom.xml文件里面引入log4j的依赖: <dependency> &l

  • 详解MyBatis日志如何做到兼容所有常用的日志框架

    前言 日志,在我们开发中是一个非常重要的话题,良好的日志打印可以帮助我们快速的定位问题,可能现在我们开发用到最多的日志框架就是slf4j了,但是日志还有其他很多优秀的框架,比如:Apache Common Log,Log4j,java.util.logging等.MyBatis作为一款优秀的ORM框架,定义了一套统一的日志接口供应用层调用,而底层却利用适配器模式兼容了我们上面所列出来的常用日志框架. MyBatis日志分类 在介绍MyBatis的全局配置文件的时候,我们提到setting内有一个

  • 详解vue3.x页面功能拆分方式

    目录 一. 组件 二.混入 三.api 四.vuex vue3.x相对比vue2.x主要的应用区别在于setup的使用,这个也是vue3.x的特色,所有的功能都得通过vue钩子引入使用,因为 setup 语法糖环境是不支持 this 的,这种开发方式有点回到原始的感觉,针对小项目还好,但如果页面模块功能复杂,如果都放到一个文件里堆叠,不仅会造成可读性差,而且时间长了难以维护,所以这就需要进行按功能拆分了,方式同vue2.x一样,一个是按照组件拆分,一个是混入处理,还有就是通过vuex或api分离

  • 详解vue-flickity的fullScreen功能实现

    描述 在项目集成了vue-flickity组件后发现,该组件参考flickity官网的fullscreen配置不起作用 实现方法 需要添加flickity-fullscreen组件 在main.js中导入flickity-fullscreen组件 添加flickity组件的fullscreen属性 定义fullscreen的CSS样式 具体步骤 1.添加flickity-fullscreen组件 需要提前配置好flickity yarn: yarn add flickity-fullscreen

  • 详解c# 泛型类的功能

    在泛型类中,由于不知道泛型参数T是什么类型,可能是引用类型,也可能是值类型,因此不能将null等赋予泛型类型.如何对泛型对象赋初值.如何保证泛型的正确性等,以使用泛型文档管理器为例: 文档管理器用于从队列中读写文档.首先创建一个泛型管理器AddDocument()方法添加一个文档到队列中,IsDocumentAvailabe只读属性指示队列中是否还有文档. public class DocumentManager<T> { private readonly Queue<T> doc

  • 详解python日志输出使用配置文件格式

    python脚本日志输出使用配置文件的形式,不需要在每个脚本里面配置日志. 需求简述: 如我要写2个脚本(a.py和b.py),a.py日志输出到/var/log/a.log,b.py日志输出到/var/log/b.log,并且日志按日期切割.如果每个脚本都去配置一遍日志的话,浪费时间也不利于后期维护. 现在我要使用配置文件的格式去统一管理python脚本的代码日志输出,后续所有python脚本日志都在这个配置文件里面配置,脚本读取.方便后续维护和增加脚本的可读性. 需求实现: 我配置文件路径及

  • 详解Unity安卓共享纹理

    概述 本文的目的是实现以下的流程: Android/iOS native app 操作摄像头 -> 获取视频流数据 -> 人脸检测或美颜 -> 传输给 Unity 渲染 -> Unity做出更多的效果(滤镜/粒子) 简单通信 在之前的博客里已经说到,Unity 和安卓通信最简单的方法是用 UnitySendMessage 等 API 实现. Android调用Unity: //向unity发消息 UnityPlayer.UnitySendMessage("Main Cam

  • 详解Unity入门之GameObject

    GameObject和Component GameObject是游戏场景中真实存在的,而且有位置的一个物件 Component附属于GameObject,控制GameObject的各种属性 GameObject是由Component组合成的,Component的生命周期和GameObject息息相关.调用此GameObject的Destroy方法,它的子对象和对应的所有Component都会被销毁,但也可以一次只销毁一个Component 常见的Component: Component 作用 R

随机推荐