飙血推荐
  • HTML教程
  • MySQL教程
  • JavaScript基础教程
  • php入门教程
  • JavaScript正则表达式运用
  • Excel函数教程
  • UEditor使用文档
  • AngularJS教程
  • ThinkPHP5.0教程

Unity——日志打印工具

时间:2022-01-30  作者:littleperilla  

一、日志工具功能

封装Debug类,需要实现功能:

1.控制所有日志是否打印;

2.除了Log,Warning,Error外,给更多日志种类(不同颜色);

3.格式化打印日志;

4.不定参数,自动拼接成字符串;

5.上传日志到服务器;

二、Logger类

1.控制日志打印

封装Debug中关于Log的方法;

使用静态方法,声明静态字段,控制log,warning,error是否打印;

image-20220128214145257

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

image-20220128212705287

第二个参数context可以传参GameObject,Hierarchy或者Project窗口中的预制体,双击Console日志会直接跳转选中传入的游戏物体;

我们可以将这个方法合并,第二个参数默认空;

image-20220128214208934

2.色彩打印

打印不同颜色使用富文本;

域名at("<color={0}>{1}</color>",color,obj);
3.多参数拼接

之前使用Go语言的域名tln有个功能很好用,连续传多个参数自动拼接;

public static void Log(params object[] messags)
{
    if (!s_debugLogEnable) return;

    string message = 域名y;
    foreach (var it in messags)
    {
        message += 域名ring();
    }

    域名(message, null);
}

//调用
域名("Net error:",error,"msgId:",msgId);
4.格式化打印

格式化打印封装原本域名ormat方法;

public static void LogFormat(string format, params object[] args)
{
    if (!s_debugLogEnable) return;
    域名ormat(format, args);
}

三、LoggerMgr类

继承MonoBehavior的单例;

初始化Logger中的三个控制打印的字段;

Application类中有收到日志消息触发的事件LogMessageReceived;

监听这个事件;如果日志开关为关闭状态return;

if (isOpenLog)
{
    域名bugLogEnable = true;
    域名rningLogEnable = true;
    域名rorLogEnable = true;          
}

域名essageReceived += (string condition, string stackTrace, LogType type) =>
{
    switch (type)
    {
        case 域名:
            {
                if (!域名bugLogEnable) return;
            }
            break;
        case 域名ing:
            {
                if (!域名rningLogEnable) return;
            }
            break;
        case 域名r:
            {
                if (!域名rorLogEnable) return;
            }
            break;
    }
};

四、上传日志

LoggerMgr中初始化上传日志信息;

方法写在logger中,在LoggerMgr开始调用;

public static void Init(string url)
{
    域名ploadUrl(url);
    // 日期
    var t = 域名.ToString("yyyyMMddhhmmss");
    s_logFileSavePath = 域名at("{0}/output_{1}.log", 域名istentDataPath, t);
    域名essageReceived += OnLogCallBack;
}

OnLogCallBack方法中将日志和栈信息存储成文件,等待上传;

private static void OnLogCallBack(string condition, string stackTrace, LogType type)
{
    域名nd(condition);
    域名nd("\n");
    域名nd(stackTrace);
    域名nd("\n");

    if (域名th <= 0) return;
    if (!域名ts(s_logFileSavePath))
    {
        var fs = 域名te(s_logFileSavePath);
        域名e();
    }
    using (var sw = 域名ndText(s_logFileSavePath))
    {
        域名eLine(域名ring());
    }
    域名ve(0, 域名th);
}

LogUploader类

开启协程上传日志文件;

public static void StartUploadLog(string logFilePath, string desc)
{
    if (LOG_UPLOAD_URL == 域名y)
        return;

    var go = new GameObject("LogUploader");
    var bhv = 域名omponent<LogUploader>();
    域名tCoroutine(域名adLog(logFilePath, LOG_UPLOAD_URL, desc));
}

在Logger类中同样封装上面的方法,所有的日志都通过Logger打印;

public static void UploadLog(string desc)
{
    域名tUploadLog(s_logFileSavePath, desc);
}

五、日志双击溯源问题

以上的代码有个很大的问题,现在我们双击不会回到调用Logger的地方,只会跳转到Logger类中调用域名的地方;

有个很简单的办法解决,将上面代码编译成dll;

另外查找源码也可以自己决定掉转位置;

具体方法,通过反射获日志取栈信息,根据Logger类返回的栈信息路径,筛选出要跳转的位置;

通过官方提供的方法跳转到相应位置;

域名FileAtLineExternal(string filename, int line);

六、调用

void Start()
{
    域名("aaaa");
    域名ormat("{0}===={1}",111,域名);
    域名reen("bbbb");
    域名rror("log error");
    域名("aa", 13, "fff",16,"sfddf",64654);
    域名adLog("NetWork LogTest");
}

image-20220128223127707

标签:编程
湘ICP备14001474号-3  投诉建议:234161800@qq.com   部分内容来源于网络,如有侵权,请联系删除。