继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Unity 自定义日志保存

慕圣7363198
关注TA
已关注
手记 28
粉丝 2
获赞 11

之前unity5.x在代码中写了debug.log..等等,打包之后在当前程序文件夹下会有个对应的"outlog.txt",2017之后这个文件被移到C盘用户Appdata/LocalLow/公司名 文件夹下面。觉得不方便就自己写了个


代码: 


using UnityEngine;https://www.pop1314.com

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 = 1;  //是现实最后1帧 

 

    #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;  //如果帧数大于总帧速 设置一下

 

            //如果堆栈帧数大于2 就获取最后两帧 反之全部输出

            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同级目录下

https://www.pop1314.com

在打包发布后某些数据会获取不到 例如行号 参考:



最后看下效果:

http://img.mukewang.com/5daa723800019e0610710371.jpg



 


不足:发布版本 出现异常捕捉不到 行号获取不到



打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP