Unity自定義日誌系統

Unity的系統日誌算是很好用,但當程序很大時,就會比較亂,所以在項目中我們往往要對日誌系統進行重新封裝使用。

一、日誌系統封裝

如下代碼,我們可以通過m_Log來控制是否打印日誌,或對輸出的日誌加入時間等修改。

    /// <summary>
    /// Log輸出開關
    /// </summary>
    public static bool m_Log = true;

    public static string GetCurrTime()
    {
        return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff");
    }

    public static void Log(object str)
    {
        if (m_Log)
        {
            Debug.Log(GetCurrTime() + "==>" + str);
        }
    }

    public static void LogWarning(object str)
    {
        if (m_Log)
        {
            Debug.LogWarning(GetCurrTime() + "==>" + str));
        }
    }

    public static void LogError(object str)
    {
        if (m_Log)
        {
            Debug.LogError(GetCurrTime() + "==>" + str));
        }
    }

二、打印日誌

很多時候當程序打包後,我們不好觀察到日誌,這種情況我們需要把日誌打印到文本保存,這樣方便查看。

保存日誌前我們需要先初始化一下文本,確保日誌爲該次運行的日誌,當然也看需求,當需要記錄每次運行的日誌時,就不需要初始化它了。

    /// <summary>
    /// 初始化日誌
    /// </summary>
    public static void InitLogTxt()
    {
        FileInfo file = new FileInfo(logTxtPath + "/logTxt.txt");
        if (file.Exists)
        {
            file.Delete();
            file.Refresh();
        }
    }

然後是之前的日誌信息寫入並保存,我這裏是保存在streamingAssets目錄下

    /// <summary>
    /// 把日誌寫入文本並保存
    /// </summary>
    /// <param name="str">日誌信息</param>
    private static void WriteLogTxt(string str)
    {
        FileInfo file = new FileInfo(Application.streamingAssetsPath+ "/logTxt.txt");
        if (!file.Exists)
        {
            writer = file.CreateText();
        }
        else
        {
            writer = file.AppendText();
        }
        writer.WriteLine(str);
        writer.Flush();
        writer.Dispose();
        writer.Close();
    }

這種方法打印出來的日誌是單條日誌信息,要想得到日誌的堆棧信息還得使用Application.logMessageReceived註冊一個事件, Application.logMessageReceived += LogCallback;如下condition爲日誌信息,stackTrace爲堆棧信息,LogType 爲日誌類型


    /// <summary>
    /// 捕捉日誌
    /// </summary>
    private static void LogCallback(string condition, string stackTrace, LogType type)
    {
        if (type == LogType.Error || type == LogType.Assert || type == LogType.Exception)
        {
            LogStr = "[" + type + "]" + GetCurrTime() + "==>" + condition + " : " + stackTrace;
            WriteLogTxt(LogStr);
        }
        else
        {
            if (m_Log)
            {
                LogStr = "[" + type + "]" + GetCurrTime() + "==>" + condition;
                WriteLogTxt(LogStr);
            }
        }
    }

此方法輸出的日誌除了也包括異常日誌[Exception],unity捕捉到的異常都能被此方法記錄下來。

還可以通過

AppDomain.CurrentDomain.UnhandledException += OnUnresolvedExceptionHandler;

    private static void OnUnresolvedExceptionHandler(object sender, UnhandledExceptionEventArgs e)
    {
        throw new NotImplementedException();
    }

來捕捉Unity未捕捉到的異常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章