unity收集log工具
参考
yusong:http://www.xuanyusong.com/archives/2477
凉鞋 :https://www.cnblogs.com/liangxiegame/p/Unity-you-xi-kuang-jia-da-jian-ba-jian-shao-jia-ba.html
根据网上的资料进行整合改整了下
使用线程刷
生成的文件在 persistentDataPath目录下
using UnityEngine; using System.Collections; using System.Collections.Generic; using System.IO; using System.Text; using System.Threading; public class OutLog : MonoBehaviour { private object mLogLock = null; private Thread mFileLogThread = null; static List<string> mLines = new List<string>(); static List<string> mWriteTxt = new List<string>(); private string outpath; /// <summary> /// 也可以手动控制这个手动启动 /// </summary> void Start() { mLogLock = new object(); //Application.persistentDataPath Unity中只有这个路径是既可以读也可以写的。 outpath = Application.persistentDataPath + "/outLog.txt"; //每次启动客户端删除之前保存的Log if (System.IO.File.Exists(outpath)) { File.Delete(outpath); } //在这里做一个Log的监听(老方法,已弃用) //Application.RegisterLogCallback(HandleLog); //用线程刷 Application.logMessageReceivedThreaded += HandleLog; this.mFileLogThread = new Thread(new ThreadStart(WriteLog)); this.mFileLogThread.Start(); //一个输出 Debug.Log("==============Unity客户端Log日志========="); } /// <summary> /// 线程刷 /// </summary> void WriteLog() { while (true) { //线程锁 lock (mLogLock) { if (mWriteTxt.Count > 0) { string[] temp = mWriteTxt.ToArray(); foreach (string t in temp) { using (StreamWriter writer = new StreamWriter(outpath, true, Encoding.UTF8)) { writer.WriteLine(t); } mWriteTxt.Remove(t); } } } } } /// <summary> /// 用update来刷(已经弃用) /// </summary> void UpdateNotUse() { //因为写入文件的操作必须在主线程中完成,所以在Update中哦给你写入文件。 if (mWriteTxt.Count > 0) { string[] temp = mWriteTxt.ToArray(); foreach (string t in temp) { using (StreamWriter writer = new StreamWriter(outpath, true, Encoding.UTF8)) { writer.WriteLine(t); } mWriteTxt.Remove(t); } } } public static string getHead() { return "[" + System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + "] "; } void HandleLog(string logString, string stackTrace, LogType type) { mWriteTxt.Add(getHead() + logString); if (type == LogType.Error || type == LogType.Exception) { //Log(logString); //Log(stackTrace); mWriteTxt.Add("ERROR: " + stackTrace); } } //这里我把错误的信息保存起来,用来输出在手机屏幕上(暂时关闭) static public void Log(params object[] objs) { string text = ""; for (int i = 0; i < objs.Length; ++i) { if (i == 0) { text += objs[i].ToString(); } else { text += ", " + objs[i].ToString(); } } if (Application.isPlaying) { if (mLines.Count > 20) { mLines.RemoveAt(0); } mLines.Add(text); } } void OnGUI() { GUI.color = Color.red; for (int i = 0, imax = mLines.Count; i < imax; ++i) { GUILayout.Label(mLines[i]); } } }