详解Unity日志打印工具功能

作者:小紫苏 时间:2022-03-27 09:34:19 

一、日志工具功能

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

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

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

3.格式化打印日志;

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

5.上传日志到服务器;

二、Logger类

1.控制日志打印

封装Debug中关于Log的方法;

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

详解Unity日志打印工具功能

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

详解Unity日志打印工具功能

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

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

详解Unity日志打印工具功能

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日志打印工具功能

工具类下载

来源:https://www.cnblogs.com/littleperilla/p/15854027.html

标签:Unity,日志,打印
0
投稿

猜你喜欢

  • 带你了解Java数据结构和算法之数组

    2022-09-29 21:18:33
  • Android BannerView通用封装详解

    2021-11-16 18:45:41
  • c#对象初始化顺序实例分析

    2023-04-08 20:47:09
  • Java 深拷贝与浅拷贝的分析

    2023-07-30 14:13:13
  • 详解Java内存泄露的示例代码

    2023-06-08 03:34:51
  • Java实现提取QSV文件视频内容

    2023-08-24 13:33:45
  • 详解Java高级特性之反射

    2021-06-09 14:01:06
  • Mybatis MapperScannerConfigurer自动扫描Mapper接口生成代理注入到Spring的方法

    2023-04-17 11:57:25
  • c# 线程定时器 System.Threading.Timer的使用

    2022-07-08 01:28:09
  • centos7下安装java及环境变量配置技巧

    2022-06-05 08:06:13
  • DWR异常情况处理常见方法解析

    2022-10-14 02:10:50
  • 基于JAVA文件中获取路径及WEB应用程序获取路径的方法

    2022-08-21 01:26:57
  • Java Maven依赖传递,可选依赖,排除依赖详解

    2022-06-09 14:24:14
  • java实现一个简单的网络爬虫代码示例

    2021-08-05 13:59:12
  • 解决Android Studio xml 格式化不自动换行的问题

    2021-09-10 06:15:42
  • C#泛型实例详解

    2021-09-11 04:21:35
  • spring-AOP 及 AOP获取request各项参数操作

    2021-11-17 19:43:34
  • C# 常用日期时间函数(老用不熟)

    2021-08-21 10:12:18
  • C#实现按照指定长度在数字前补0方法小结

    2023-02-23 09:42:32
  • Java实现双色球抽奖随机算法示例

    2023-04-25 12:15:38
  • asp之家 软件编程 m.aspxhome.com