zoukankan      html  css  js  c++  java
  • 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]);
            }
        }
    }
  • 相关阅读:
    Java LinkedHashMap 逆序遍历
    (java/javascript) list 交集 并集 差集 去重复并集
    Map集合的四种遍历方式(转载)
    本地jar包 安装到本地仓库中的命令
    BigDecimal加减乘除运算(转)
    反射与内置方法
    项目二:选课系统
    绑定方法与非绑定方法
    多态性与鸭子类型
    继承与派生
  • 原文地址:https://www.cnblogs.com/sanyejun/p/8971002.html
Copyright © 2011-2022 走看看