zoukankan      html  css  js  c++  java
  • Unity 自定义日志保存

    此文转载自:https://blog.csdn.net/K20132014/article/details/86528716#commentBox

    前言    

       之前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() + "]
                ";
    
                    //或者直接调用tostring 显示数据过多 且打包后有些数据获取不到
                    // stackStr += sf.ToString();
                }
    
                //或者 stackStr = stack.ToString();
                string content = string.Format("time: {0}   logType: {1}    logString: {2} 
    stackTrace: {3} {4} ",
                                                   DateTime.Now.ToString("HH:mm:ss"), type, logString, stackStr, "
    ");
                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 捕捉到更多信息

       

    更多内容详见微信公众号:Python测试和开发

    Python测试和开发

  • 相关阅读:
    将.lib库文件转换成.a库文件的工具
    协议
    协议
    bzoj1066
    bzoj2668
    bzoj2245
    bzoj2324后续思考
    bzoj2324
    jsoi2014前两轮回眸
    bzoj1293
  • 原文地址:https://www.cnblogs.com/phyger/p/14073302.html
Copyright © 2011-2022 走看看