46

关于Debug.Log的一点儿小知识-腾讯游戏学院

 5 years ago
source link: http://gad.qq.com/article/detail/288533
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
今天同事在接腾讯Bugly异常上报SDK时,涉及到了一些关于Debug.Log的问题,所以就又回顾了一下官方的文档

在Unity当中,我们输出Log都会使用Debug.Log,Log的类型分为以下几种:

Log--常规日志
Warning--警告日志
Assert--断言
Error--错误
Exception--异常

也可以按照日志的严重程度来排列

对应的API:

 Debug.Log("regular log");

Debug.LogWarning("this is a warning!!! but we never care about it");

Debug.LogAssertion("this is an Assert,hmmm....it must be something wrong!");

Debug.LogError("this is an Error,You have to fix it!");

Debug.LogException(new System.Exception("How about we delete these codes?"));

在Debug类中有个只读属性:
 public static ILogger logger { get; }

Debug只是一个logger属性的Wrapper包装,所有Debug相关均是由logger接口实现

查阅一下Debug的源码发现,所有类型的输出只提供了object参数版本,Debug总是要输出值类型的,这样就一定会出现boxing装箱的操作,如果我们在Update中去做这样的Log,那么每一帧都会在堆上分配内存,会产生内存碎片,容易引起GC,所以一定要在Release版本中关闭掉Log日志的输出

如何关闭Debug.Log?

在ILogger接口下,有个logEnabled属性,设置为false,就可以屏蔽Log的输出,但这种一刀切的手段肯定是不适应的,比如说我还想保留Warning,Error,Exception输出,像Bugly就可以捕获Debug.LogError级别的输出,所以需要使用其它的方式来解决。

(不过我个人还是建议,调试的代码应该测试完就屏蔽掉)

在ILogger接口下,有另外一个枚举属性filterLogType:

5bf5fc11632ce.png

filterLogType默认设置是Log,会显示所有类型的Log
Warning:会显示Warning,Assert,Error,Exception
Assert:会显示Assert,Error,Exception
Error:显示Error和Exception
Exception:只会显示Exception

所以只需要改变filterLogType就可以了,比如改为Assert,这样Assert,Error,Exception都可以输出并被相应的第三方异常上报SDK捕获到。

官主提供了一段代码:
https://docs.unity3d.com/ScriptReference/Logger-filterLogType.html


5bf5fd40a90ff.png



通过Debug下isDebugBuild属性来判断当前的版本是Debug版还是Release
当处于DB版本的时候,我使用LogType.Log,输出所有的Log,正式版本的时候,只输出Warning以上级别的,如果我们只需要Assert以上的,就设置为Assert即可。

如果想要更灵活的使用,可以和宏配合使用,或是可以通过命令行的方式行来打包,避免每次都去修改BuildingSettings

In the Build Settings dialog there is a check box called "Development Build".

isDebugBuild的设置是在BuildSetting下的Development Build,我们在真机上进行Profiler性能调试的时候,都要使用Development Build版本

而且logger还有一个好处是可以自定义TAG,这样可以更方便的Filter到我们想看的日志,默认Debug.Log都有默认的TAG Unity

对于日志系统,在AssetStore上可以找到非常多,都有着很丰富的定义,但满足自己当下的需求就好了,而且为了方便日志系统更利于自己的使用,通常都会封装一套自己的日志系统,比如:

1.我要区分我的日志和Debug.Log日志,或是和Android,iOS系统日志
2.我需要在输出日志的时候,带上时间和由哪个类输出等参数
3.真机调试时,我需要将真机上的日志保存在一个文件中,这样不用担心日志被顶掉,也不用过滤,直接查看导出的日志文件即可,甚至 可以做得再全面一些,可以将日志在后台上传到服务器

https://docs.unity3d.com/ScriptReference/ILogHandler.html

这是官方提供的一个自定义ILogHandler的代码,目的就是将我们的Log输出到控制台的同时,输出到日志文件中

5bf614c92c424.png

实现ILogHandler接口,LogFormat和LogException,这里也可以根据 LogType进行自定义

使用方法:
5bf618ad596ca.png

最后日志输出到了Mylogs.txt下:

5bf61b4db12fd.png



大致了解了日志的级别,如何过滤不同级别的日志,如何ON/OFF日志,将日志保存到文件中等等这些基本的操作以后,封装一套自己的日志系统就只就剩下体力劳动了,在Unity上有很多插件会对
Unity Console也进行了自定义的输出,如果对编辑器开发感兴趣的,可以拿下来研究研究

感谢您的阅读,如文中有误,欢迎指正,共同提高。










About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK