聊聊Unity 自定義日志保存的問題
前言
之前unity5.x在代碼中寫了debug.log..等等,打包之后在當(dāng)前程序文件夾下會(huì)有個(gè)對(duì)應(yīng)的"outlog.txt",2017之后這個(gè)文件被移到C盤用戶Appdata/LocalLow/公司名 文件夾下面。覺得不方便就自己寫了個(gè)
代碼
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;//是否在編輯器中也產(chǎn)生日志文件
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)
{
//在編輯器中設(shè)置isEditorCreate==true時(shí)候產(chǎn)生日志
if (isEditorCreate)
{
CreateOutlog();
}
}
//不在編輯器中 是否產(chǎn)生日志由 Debug.unityLogger.logEnabled 控制
else
{
CreateOutlog();
}
}
}
private void Application_logMessageReceivedThreaded(string logString, string stackTrace, LogType type)
{
// Debug.Log(stackTrace); //打包后staackTrace為空 所以要自己實(shí)現(xiàn)
if (type != LogType.Warning)
{
// StackTrace stack = new StackTrace(1,true); //跳過第二?(1)幀
StackTrace stack = new StackTrace(true); //捕獲所有幀
string stackStr = string.Empty;
int frameCount = stack.FrameCount; //幀數(shù)
if (this.showFrames > frameCount) this.showFrames = frameCount; //如果幀數(shù)大于總幀速 設(shè)置一下
//自定義輸出幀數(shù),可以自行試試查看效果
for (int i = stack.FrameCount - this.showFrames; i < stack.FrameCount; i++)
{
StackFrame sf = stack.GetFrame(i); //獲取當(dāng)前幀信息
// 1:第一種 ps:GetFileLineNumber 在發(fā)布打包后獲取不到
stackStr += "at [" + sf.GetMethod().DeclaringType.FullName +
"." + sf.GetMethod().Name +
".Line:" + sf.GetFileLineNumber() + "]\n ";
//或者直接調(diào)用tostring 顯示數(shù)據(jù)過多 且打包后有些數(shù)據(jù)獲取不到
// 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>
/// 關(guān)閉跟蹤日志信息
/// </summary>
public void CloseTrace()
{
Application.logMessageReceivedThreaded -= Application_logMessageReceivedThreaded;
streamWriter.Dispose();
streamWriter.Close();
fileStream.Dispose();
fileStream.Close();
}
/// <summary>
/// 設(shè)置選項(xiàng)
/// </summary>
/// <param name="logEnable">是否記錄日志</param>
/// <param name="showFrams">是否顯示所有堆棧幀 默認(rèn)只顯示當(dāng)前幀 如果設(shè)為0 則顯示所有幀</param>
/// <param name="filterLogType">過濾 默認(rèn)log級(jí)別以上</param>
/// <param name="editorCreate">是否在編輯器中產(chǎn)生日志記錄 默認(rèn)不需要</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;
}
}
關(guān)于 filterLogType
filterLogType默認(rèn)設(shè)置是Log,會(huì)顯示所有類型的Log。
Warning:會(huì)顯示W(wǎng)arning,Assert,Error,Exception
Assert:會(huì)顯示Assert,Error,Exception
Error:顯示Error和Exception
Exception:只會(huì)顯示Exception
使用
using UnityEngine;
public class Test : MonoBehaviour
{
private BoxCollider boxCollider;
void Start()
{
DebugTrace.Instance.SetLogOptions(true, 2, editorCreate: true); //設(shè)置日志打開 顯示2幀 并且編輯器下產(chǎn)生日志
DebugTrace.Instance.StartTrace();
Debug.Log("log");
Debug.Log("log", this);
Debug.LogError("LogError");
Debug.LogAssertion("LogAssertion");
boxCollider.enabled = false; //報(bào)錯(cuò) 發(fā)布后捕捉不到幀
}
private void OnApplicationQuit()
{
DebugTrace.Instance.CloseTrace();
}
}
如果在編輯器中也設(shè)置產(chǎn)生日志,日志文件在當(dāng)前項(xiàng)目路徑下,打包后在exe同級(jí)目錄下
在打包發(fā)布后某些數(shù)據(jù)會(huì)獲取不到 例如行號(hào)
StackFrame參考

最后看下效果:

不足
發(fā)布版本 出現(xiàn)異常捕捉不到 行號(hào)獲取不到
debug版本可以勾選DevelopMend build 捕捉到更多信息

到此這篇關(guān)于聊聊Unity 自定義日志保存的問題的文章就介紹到這了,更多相關(guān)Unity日志保存內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實(shí)現(xiàn)調(diào)用本機(jī)攝像頭實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)調(diào)用本機(jī)攝像頭的方法,可以實(shí)現(xiàn)調(diào)用本機(jī)攝像頭進(jìn)行拍照,具有不錯(cuò)的實(shí)用價(jià)值,需要的朋友可以參考下2014-08-08
C#實(shí)現(xiàn)獲取IIS站點(diǎn)及虛擬目錄信息的方法
這篇文章主要介紹了C#實(shí)現(xiàn)獲取IIS站點(diǎn)及虛擬目錄信息的方法,可實(shí)現(xiàn)獲取IIS站點(diǎn)信息及物理路徑等功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
c#中將uint值轉(zhuǎn)換成int的實(shí)例方法
在本文里小編給大家整理的是關(guān)于c#中將uint值轉(zhuǎn)換成int的實(shí)例方法,需要的朋友們學(xué)習(xí)參考下。2019-08-08
C#通過配置文件動(dòng)態(tài)修改web.config內(nèi)容的操作步驟
這篇文章主要介紹了C#通過配置文件動(dòng)態(tài)修改web.config內(nèi)容的操作步驟,文中通過圖文結(jié)合的方式介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-03-03
C# 使用 Castle 實(shí)現(xiàn) AOP及如何用 Autofac 集成 Castle
這篇文章主要介紹了C# 使用 Castle 實(shí)現(xiàn) AOP及如何用 Autofac 集成 Castle,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-02-02

