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