前言
之前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; //如果幀數大于總幀速 設定一下
//自定義輸出幀數,可以自行試試查看效果
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參考

最后看下效果:

不足
發布版本 出現例外捕捉不到 行號獲取不到
debug版本可以勾選DevelopMend build 捕捉到更多資訊

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/224380.html
標籤:其他
上一篇:分享一些程式員接私活、兼職的平臺
