中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用Unity怎么自定義保存日志

發布時間:2021-05-13 16:54:42 來源:億速云 閱讀:257 作者:Leah 欄目:開發技術

這期內容當中小編將會給大家帶來有關使用Unity怎么自定義保存日志,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

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參考

使用Unity怎么自定義保存日志

最后看下效果:

使用Unity怎么自定義保存日志

不足

發布版本 出現異常捕捉不到 行號獲取不到

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

使用Unity怎么自定義保存日志

上述就是小編為大家分享的使用Unity怎么自定義保存日志了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

土默特左旗| 哈巴河县| 富川| 安岳县| 五常市| 松原市| 工布江达县| 金门县| 罗甸县| 察隅县| 汨罗市| 富民县| 古交市| 长宁区| 平潭县| 夏邑县| 临武县| 金坛市| 富锦市| 潜江市| 咸阳市| 姚安县| 天长市| 天台县| 高平市| 塔城市| 丽江市| 界首市| 略阳县| 建阳市| 呼图壁县| 宝山区| 巴林右旗| 仁布县| 依安县| 眉山市| 昭通市| 大同县| 万安县| 三原县| 宜兴市|