Unity自定义日志系统

Unity的系统日志算是很好用,但当程序很大时,就会比较乱,所以在项目中我们往往要对日志系统进行重新封装使用。

一、日志系统封装

如下代码,我们可以通过m_Log来控制是否打印日志,或对输出的日志加入时间等修改。

    /// 
    /// Log输出开关
    /// 
    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));
        }
    }

二、打印日志

很多时候当程序打包后,我们不好观察到日志,这种情况我们需要把日志打印到文本保存,这样方便查看。

保存日志前我们需要先初始化一下文本,确保日志为该次运行的日志,当然也看需求,当需要记录每次运行的日志时,就不需要初始化它了。

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

然后是之前的日志信息写入并保存,我这里是保存在streamingAssets目录下

    /// 
    /// 把日志写入文本并保存
    /// 
    /// 日志信息
    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 为日志类型


    /// 
    /// 捕捉日志
    /// 
    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未捕捉到的异常。

你可能感兴趣的:(Unity3D)