360一分快三三不同号屋(syslsn.cn)精品网站一分快三三不同号,织梦模版,游戏一分快三三不同号分享平台
当前位置:网站首页 VIP资源 网站搭建 正文

Unity 自定义日志保存

时间:2020-03-06 23:46:44 [网站搭建]作者:360一分快三三不同号屋

   360网站一分快三三不同号总结:之前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;  //如果帧数大于总帧速 设置一下

 

            //如果堆栈帧数大于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同级目录下


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


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


debug版本可以勾选DevelopMend build 捕捉到更多信息




本文标签:AutoTags插件服务端需要您提供购买者的账号和密码才能继续访问  福利活动  自由织梦  织梦猫  秀站网  跟版网  dede58  莎莎一分快三三不同号  折翼天使 

转载请注明来源:Unity 自定义日志保存

本文永久链接地址:http://syslsn.cn/9644.html

郑重声明:
本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,不存在任何商业目的与商业用途。
若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。 我们不承担任何技术及版权问题,且不对任何资源负法律责任。
如无法链接失效或侵犯版权,请给我们来信:han2311678@163.com