前言
之前unity5.x在代码中写了debug.log..等等,打包之后在当前程序文件夹下会有个对应的"outlog.txt",2017之后这个文件被移到C盘用户Appdata/LocalLow/公司名 文件夹下面。觉得不方便就自己写了个
代码
- using UnityEngine;
- using System.IO;
- using System;
- using System.Diagnostics;
- using Debug = UnityEngine.Debug;
- public class DebugTrace
- {
- private FileStream fileStream;
- private StreamWriter streamWriter;
- private bool isEditorCreate = false;//是否在编辑器中也产生日志文件
- private int showFrames = 1000; //打印所有
- #region instance
- private static readonly object obj = new object();
- private static DebugTrace m_instance;
- public static DebugTrace Instance
- {
- get
- {
- if (m_instance == null)
- {
- lock (obj)
- {
- if (m_instance == null)
- m_instance = new DebugTrace();
- }
- }
- return m_instance;
- }
- }
- #endregion
- private DebugTrace()
- {
- }
- /// <summary>
- /// 开启跟踪日志信息
- /// </summary>
- public void StartTrace()
- {
- if (Debug.unityLogger.logEnabled)
- {
- if (Application.isEditor)
- {
- //在编辑器中设置isEditorCreate==true时候产生日志
- if (isEditorCreate)
- {
- CreateOutlog();
- }
- }
- //不在编辑器中 是否产生日志由 Debug.unityLogger.logEnabled 控制
- else
- {
- CreateOutlog();
- }
- }
- }
- private void Application_logMessageReceivedThreaded(string logString, string stackTrace, LogType type)
- {
- // Debug.Log(stackTrace); //打包后staackTrace为空 所以要自己实现
- if (type != LogType.Warning)
- {
- // StackTrace stack = new StackTrace(1,true); //跳过第二?(1)帧
- StackTrace stack = new StackTrace(true); //捕获所有帧
- string stackStr = string.Empty;
- int frameCount = stack.FrameCount; //帧数
- if (this.showFrames > frameCount) this.showFrames = frameCount; //如果帧数大于总帧速 设置一下
- //自定义输出帧数,可以自行试试查看效果
- for (int i = stack.FrameCount - this.showFrames; i < stack.FrameCount; i++)
- {
- StackFrame sf = stack.GetFrame(i); //获取当前帧信息
- // 1:第一种 ps:GetFileLineNumber 在发布打包后获取不到
- stackStr += "at [" + sf.getmethod().DeclaringType.FullName +
- "." + sf.getmethod().Name +
- ".Line:" + sf.GetFileLineNumber() + "]\n ";
- //或者直接调用tostring 显示数据过多 且打包后有些数据获取不到
- // stackStr += sf.ToString();
- }
- //或者 stackStr = stack.ToString();
- string content = string.Format("time: {0} logType: {1} logString: {2} \nstackTrace: {3} {4} ",
- DateTime.Now.ToString("HH:mm:ss"), type, logString, stackStr, "\r\n");
- streamWriter.WriteLine(content);
- streamWriter.Flush();
- }
- }
- private void CreateOutlog()
- {
- if (!Directory.Exists(Application.dataPath + "/../" + "OutLog"))
- Directory.CreateDirectory(Application.dataPath + "/../" + "OutLog");
- string path = Application.dataPath + "/../OutLog" + "/" + DateTime.Now.ToString("yyyyMMddHHmmss") + "_log.txt";
- fileStream = new FileStream(path, FileMode.OpenorCreate, FileAccess.ReadWrite);
- streamWriter = new StreamWriter(fileStream);
- Application.logMessageReceivedThreaded += Application_logMessageReceivedThreaded;
- }
- /// <summary>
- /// 关闭跟踪日志信息
- /// </summary>
- public void CloseTrace()
- {
- Application.logMessageReceivedThreaded -= Application_logMessageReceivedThreaded;
- streamWriter.dispose();
- streamWriter.Close();
- fileStream.dispose();
- fileStream.Close();
- }
- /// <summary>
- /// 设置选项
- /// </summary>
- /// <param name="logEnable">是否记录日志</param>
- /// <param name="showFrams">是否显示所有堆栈帧 默认只显示当前帧 如果设为0 则显示所有帧</param>
- /// <param name="filterLogType">过滤 默认log级别以上</param>
- /// <param name="editorCreate">是否在编辑器中产生日志记录 默认不需要</param>
- public void Setlogoptions(bool logEnable, int showFrams = 1, LogType filterLogType = LogType.Log, bool editorCreate = false)
- {
- Debug.unityLogger.logEnabled = logEnable;
- Debug.unityLogger.filterLogType = filterLogType;
- isEditorCreate = editorCreate;
- this.showFrames = showFrams == 0 ? 1000 : showFrams;
- }
- }
关于 filterLogType
filterLogType默认设置是Log,会显示所有类型的Log。
Warning:会显示Warning,Assert,Error,Exception
Assert:会显示Assert,Error,Exception
Error:显示Error和Exception
Exception:只会显示Exception
使用
- using UnityEngine;
- public class Test : MonoBehavIoUr
- {
- private BoxCollider BoxCollider;
- void Start()
- {
- DebugTrace.Instance.Setlogoptions(true, 2, editorCreate: true); //设置日志打开 显示2帧 并且编辑器下产生日志
- DebugTrace.Instance.StartTrace();
- Debug.Log("log");
- Debug.Log("log", this);
- Debug.LogError("LogError");
- Debug.LogAssertion("LogAssertion");
- BoxCollider.enabled = false; //报错 发布后捕捉不到帧
- }
- private void OnApplicationQuit()
- {
- DebugTrace.Instance.CloseTrace();
- }
- }
如果在编辑器中也设置产生日志,日志文件在当前项目路径下,打包后在exe同级目录下
在打包发布后某些数据会获取不到 例如行号
StackFrame参考
最后看下效果:
不足
发布版本 出现异常捕捉不到 行号获取不到
debug版本可以勾选DevelopMend build 捕捉到更多信息
参考资料:
植物大战僵尸破解版: http://www.pvzbaike.com/archives/pvz_pojie/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。