聊聊Unity 自定义日志保存的问题
作者:Zero_LJ 时间:2021-11-28 15:38:55
前言
之前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://blog.csdn.net/K20132014/article/details/86528716
标签:Unity,日志,保存
0
投稿
猜你喜欢
java代码实现C盘文件统计工具
2021-06-23 01:22:38
Java Socket使用加密协议进行传输对象的方法
2023-11-28 12:47:44
Spring中使用atomikos+druid实现经典分布式事务的方法
2023-07-14 00:46:17
Java线程同步的四种方式详解
2021-09-02 19:57:36
Android切换至SurfaceView时闪屏(黑屏闪一下)以及黑屏移动问题的解决方法
2023-07-21 10:51:45
spring cglib 与 jdk 动态代理
2021-07-19 20:28:43
关于eclipse中运行tomcat提示端口被占用的4种解决
2022-04-15 10:56:12
Java面向对象基础知识之抽象类和接口
2023-02-10 03:02:58
Spring集成Druid连接池及监控配置的全过程
2023-08-25 05:22:20
java实现简单单链表
2023-10-30 09:45:46
spring data jpa使用详解(推荐)
2022-06-19 05:22:17
Android采取ContentObserver方式自动获取验证码
2023-07-31 16:20:48
java的io操作(将字符串写入到txt文件中)
2022-05-28 22:59:23
解决Springboot项目启动后自动创建多表关联的数据库与表的方案
2023-11-24 01:11:27
java 实现文件复制和格式更改的实例
2023-10-21 08:07:49
关于@Autowired注解和静态方法及new的关系
2021-07-16 13:08:06
Default Methods实例解析
2023-05-18 19:28:01
JavaCV实现照片马赛克效果
2023-04-27 15:55:14
Java实现常用缓存淘汰算法:FIFO、LRU、LFU
2022-08-26 21:45:19
android studio2.3如何编译动态库的过程详解
2023-07-11 03:47:48