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]);
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/sanyejun/p/8971002.html
今日推荐