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 ( )
{
}
///
/// 开启跟踪日志信息
///
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, "rn" );
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;
}
///
/// 关闭跟踪日志信息
///
public void CloseTrace ( )
{
Application.logMessageReceivedThreaded -= Application_logMessageReceivedThreaded;
streamWriter.Dispose;
streamWriter.Close;
fileStream.Dispose;
fileStream.Close;
}
///
/// 设置选项
///
/// 是否记录日志
/// 是否显示所有堆栈帧 默认只显示当前帧 如果设为0 则显示所有帧
/// 过滤 默认log级别以上
/// 是否在编辑器中产生日志记录 默认不需要
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;
}
}