Unity自己有log系统,为什么要自己封装一个
1.不好用,只能在pc上记录log文件,移动平台是没有的
2.在开发时期的log,不想在正式版里面出现。没有一个统一的开关来控制是不是要显示log,要显示什么类型的log

那么怎么做?
我的思路是:Unity里面的所有的log,都会被 Application.logMessageReceived 捕获
只要添加一个回调来把这些log信息记录下来保存就好了
Application.logMessageReceived += ProcessExceptionReport;

代码1:log等级枚举,被用来控制是否显示log,显示哪些类型的log

  1. namespace ShiHuanJue.Debuger
  2. {
  3. /// <summary>
  4. /// log等级
  5. /// </summary>
  6. public enum LogLevel
  7. {
  8. None = ,
  9. Debug = ,
  10. Error = ,
  11. Warning = ,
  12. Exception = ,
  13. All = LogLevel.Debug | LogLevel.Error | LogLevel.Warning | LogLevel.Exception
  14. }
  15. }

代码2:把log记录到文本里

  1. using UnityEngine;
  2. using System.Collections;
  3. using System.IO;
  4. using System;
  5. using System.Text;
  6.  
  7. namespace ShiHuanJue.Debuger
  8. {
  9. public class LogWriter
  10. {
  11. private string m_logPath = Application.persistentDataPath + "/log/";
  12. private string m_logFileName = "log_{0}.txt";
  13. private string m_logFilePath = string.Empty;
  14.  
  15. public LogWriter()
  16. {
  17. if (!Directory.Exists(m_logPath))
  18. {
  19. Directory.CreateDirectory(m_logPath);
  20. }
  21. this.m_logFilePath = this.m_logPath + string.Format(this.m_logFileName, DateTime.Today.ToString("yyyyMMdd"));
  22. }
  23.  
  24. public void ExcuteWrite(string content)
  25. {
  26. using (StreamWriter writer = new StreamWriter(m_logFilePath, true, Encoding.UTF8))
  27. {
  28. writer.WriteLine(content);
  29. }
  30. }
  31. }
  32. }

代码3:log帮助类

  1. using UnityEngine;
  2. using System;
  3.  
  4. namespace ShiHuanJue.Debuger
  5. {
  6. public class LogHelper
  7. {
  8. static public LogLevel m_logLevel = LogLevel.All;
  9. static LogWriter m_logWriter = new LogWriter();
  10.  
  11. static LogHelper()
  12. {
  13. Application.logMessageReceived += ProcessExceptionReport;
  14. }
  15.  
  16. private static void ProcessExceptionReport(string message, string stackTrace, LogType type)
  17. {
  18. LogLevel dEBUG = LogLevel.Debug;
  19. switch (type)
  20. {
  21. case LogType.Error:
  22. dEBUG = LogLevel.Error;
  23. break;
  24. case LogType.Assert:
  25. dEBUG = LogLevel.Debug;
  26. break;
  27. case LogType.Warning:
  28. dEBUG = LogLevel.Warning;
  29. break;
  30. case LogType.Log:
  31. dEBUG = LogLevel.Debug;
  32. break;
  33. case LogType.Exception:
  34. dEBUG = LogLevel.Exception;
  35. break;
  36. }
  37.  
  38. if (dEBUG == (m_logLevel & dEBUG))
  39. {
  40. Log(string.Concat(new object[] { " [", dEBUG, "]: ", message, '\n', stackTrace }));
  41. }
  42. }
  43.  
  44. /// <summary>
  45. /// 加上时间戳
  46. /// </summary>
  47. /// <param name="message"></param>
  48. private static void Log(string message)
  49. {
  50. string msg = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss,fff") + message;
  51. m_logWriter.ExcuteWrite(msg);
  52. }
  53.  
  54. static public void Log(object message)
  55. {
  56. Log(message, null);
  57. }
  58. static public void Log(object message, UnityEngine.Object context)
  59. {
  60. if (LogLevel.Debug == (m_logLevel & LogLevel.Debug))
  61. {
  62. Debug.Log(message, context);
  63. }
  64. }
  65. static public void LogError(object message)
  66. {
  67. LogError(message, null);
  68. }
  69. static public void LogError(object message, UnityEngine.Object context)
  70. {
  71. if (LogLevel.Error == (m_logLevel & LogLevel.Error))
  72. {
  73. Debug.LogError(message, context);
  74. }
  75. }
  76. static public void LogWarning(object message)
  77. {
  78. LogWarning(message, null);
  79. }
  80. static public void LogWarning(object message, UnityEngine.Object context)
  81. {
  82. if (LogLevel.Warning == (m_logLevel & LogLevel.Warning))
  83. {
  84. Debug.LogWarning(message, context);
  85. }
  86. }
  87. }
  88. }

游戏上线之前把LogHelper.m_logLevel = LogLevel.None;Log就不显示了。
LogHelper.m_logLevel = LogLevel.Error;是显示Error。
LogHelper.m_logLevel = LogLevel.Debug | LogLevel.Error;同时显示Debug和Error。

log文件是保存在 private string m_logPath = Application.persistentDataPath + “/log/”;在手机上就是沙盒路径。
log文件是以天为单位,同一天的log会被记录到一个文件里面。

怎么用呢?

  1. using UnityEngine;
  2. using ShiHuanJue.Debuger;
  3.  
  4. public class Test : MonoBehaviour
  5. {
  6. void Start()
  7. {
  8. LogHelper.m_logLevel = LogLevel.All;
  9. LogHelper.Log("debug");
  10. LogHelper.LogError("error");
  11. LogHelper.LogWarning("warning");
  12.  
  13. GameObject go = GameObject.Find("fsdfsd");
  14. GameObject.Instantiate(go);
  15. }
  16. }

这里测试了几种典型的情况,包括找不到go,实例化的时候系统报的异常
有图有真相~!

查看一下log文件

最后我封装了一个dll,直接放到工程下头就可以用了。
大家也可以在这里下载:链接: http://pan.baidu.com/s/1qWFtQOG 密码: erpx
代码都在上面,你们也可以去生成。

自己封装一个Log模块的更多相关文章

  1. 【Android自动化】编写一个log模块,输出至控制台,供程序运行查看

    # -*- coding:utf-8 -*- import logging def get_log(name): log = logging.getLogger(name) log.setLevel( ...

  2. go: 一个通用log模块的实现

    在go里面,虽然有log模块,但是该模块提供的功能并不强,譬如就没有我们常用的level log功能,但是自己实现一个log模块也并不困难. 对于log的level,我们定义如下: const ( L ...

  3. python+selenium之自定义封装一个简单的Log类

    python+selenium之自定义封装一个简单的Log类 一. 问题分析: 我们需要封装一个简单的日志类,主要有以下内容: 1. 生成的日志文件格式是 年月日时分秒.log 2. 生成的xxx.l ...

  4. Python之自定义封装一个简单的Log类

    参考:http://www.jb51.net/article/42626.htm 参考:http://blog.csdn.net/u011541946/article/details/70198676 ...

  5. Python+Selenium中级篇之8-Python自定义封装一个简单的Log类《转载》

    Python+Selenium中级篇之8-Python自定义封装一个简单的Log类: https://blog.csdn.net/u011541946/article/details/70198676

  6. frp源码剖析-frp中的log模块

    前言&引入 一个好的log模块可以帮助我们排错,分析,统计 一般来说log中需要有时间.栈信息(比如说文件名行号等),这些东西一般某些底层log模块已经帮我们做好了.但在业务中还有很多我们需要 ...

  7. 代码改变世界 | 如何封装一个简单的 Koa

    下面给大家带来:封装一个简单的 Koa Koa 是基于 Node.js 平台的下一代 web 开发框架 Koa 是一个新的 web 框架,可以快速而愉快地编写服务端应用程序,本文将跟大家一起学习:封装 ...

  8. Python(文件、文件夹压缩处理模块,shelve持久化模块,xml处理模块、ConfigParser文档配置模块、hashlib加密模块,subprocess系统交互模块 log模块)

    OS模块 提供对操作系统进行调用的接口 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname")  改变当前脚本工作目 ...

  9. Android架构分析之LOG模块

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android版本:2.3.7_r1 Linux内核版本:android-goldfish-2.6.29 Andro ...

随机推荐

  1. 14个技巧助你适配 iOS10

    1.Notification(通知) 自从 Notification 被引入之后,苹果就不断的更新优化,但这些更新优化只是小打小闹,直至现在iOS 10开始真正的进行大改重构,这让开发者也体会到 Us ...

  2. Spring实战 (第3版)——AOP

    在软件开发中,分布于应用中多处的功能被称为横切关注点.通常,这些横切关注点从概念上是与应用的 业务逻辑相分离的(但是往往直接嵌入到应用的业务逻辑之中).将这些横切关注点与业务逻辑相分离正是 面向切面编 ...

  3. 大熊君JavaScript插件化开发------(实战篇之DXJ UI ------ ProcessBar)

    一,开篇分析 Hi,大家好!大熊君又和大家见面了,还记得前两篇文章吗.主要讲述了以“jQuery的方式如何开发插件”,以及过程化设计与面向对象思想设计相结合的方式是 如何设计一个插件的,两种方式各有利 ...

  4. PHP cookie

    PHP Cookie cookie 常用于识别用户. Cookie 是什么? cookie 常用于识别用户.cookie 是一种服务器留在用户计算机上的小文件.每当同一台计算机通过浏览器请求页面时,这 ...

  5. 2013成都网络赛 C We Love MOE Girls(水题)

    We Love MOE Girls Time Limit: 1000/500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  6. Shell入门教程:算术运算

    Bash的算术运算有以下几种方法: 序号 名称 语法 范例 1 算术扩展 $((算术式)) r=$((2+5*8)) 2 使用外部程序 expr 算术式 r=`expr 4 + 5` 3 使用 $[] ...

  7. android:layout_height、android:layout_width、android:height、android:width的关系与区别

    一直一来对android:layout_height.android:layout_width.android:height.android:width这几个属性的关系有些不理解,既然有了androi ...

  8. window共享linux下的文件 samba

    1.在Ubuntu上安装samba服务 sudo apt-get install samba 2.修改配置文件vim /etc/samba/smb.conf [xubu] (共享名) guest ac ...

  9. Android四大组件知识整理

    1. Activity 1.1 什么是Activity? Activity是Context的子类,并可以处理与窗体用户的事件: 1.2 Activity的生命周期 不存在->`onCreate( ...

  10. [Keygen]IntelliJ IDEA 14.1.7

    IntelliJ IDEA 14.1.7 Keygen package com.candy.keygen.intelliJIdea; import java.math.BigInteger; impo ...