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

      之前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()

      {

      }

      ///

      /// 开启跟踪日志信息

      ///

      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; //如果帧数大于总帧速 设置一下

      //如果堆栈帧数大于2 就获取最后两帧 反之全部输出

      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;

      }

      ///

      /// 关闭跟踪日志信息

      ///

      public void CloseTrace()

      {

      Application.logMessageReceivedThreaded -= Application_logMessageReceivedThreaded;

      streamWriter.Dispose();

      streamWriter.Close();

      fileStream.Dispose();

      fileStream.Close();

      }

      ///

      /// 设置选项

      ///

      ///是否记录日志

      ///是否显示所有堆栈帧 默认只显示当前帧 如果设为0 则显示所有帧

      ///过滤 默认log级别以上

      ///是否在编辑器中产生日志记录 默认不需要

      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;

      }  郑州妇科医院那家好:http://www.zzyytj.com/郑州妇科医院哪里好:http://www.zzyytj.com/郑州治疗妇科哪家医院好:http://www.zzyytj.com/

      }

      关于 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同级目录下

      在打包发布后某些数据会获取不到 例如行号 参考:

      最后看下效果:

      不足:发布版本 出现异常捕捉不到 行号获取不到

      debug版本可以勾选DevelopMend build 捕捉到更多信息

  • 相关阅读:
    数据结构
    查找算法
    排序算法
    ThreadPoolExecutor
    Python map()函数
    Python惰性序列
    Python iterator迭代器
    Python yield关键字 和 Generator(生成器)
    Python 列表生成式(List Comprehensions)
    Python 迭代(iteration)
  • 原文地址:https://www.cnblogs.com/sushine1/p/12973158.html
Copyright © 2011-2022 走看看