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未捕捉到的異常。