返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >聊聊Unity 自定义日志保存的问题
  • 424
分享到

聊聊Unity 自定义日志保存的问题

2024-04-02 19:04:59 424人浏览 独家记忆
摘要

前言        之前Unity5.x在代码中写了debug.log..等等,打包之后在当前程序文件夹下会有个对应的"o

前言    

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

到此这篇关于聊聊Unity 自定义日志保存的问题的文章就介绍到这了,更多相关Unity日志保存内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 聊聊Unity 自定义日志保存的问题

本文链接: https://lsjlt.com/news/125760.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 聊聊Unity 自定义日志保存的问题
    前言        之前unity5.x在代码中写了debug.log..等等,打包之后在当前程序文件夹下会有个对应的"o...
    99+
    2024-04-02
  • 使用Unity怎么自定义保存日志
    这期内容当中小编将会给大家带来有关使用Unity怎么自定义保存日志,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。using UnityEngine;using System.IO;us...
    99+
    2023-06-15
  • 聊聊Unity自定义组件之序列帧播放组件问题
      我们知道在unity中播放序列帧动画有两种方式,第一种是利用Unity自带的animation组件来播放,我们只需要在工程目录中全选选中所有我们需要播放的图片,将其拖动到Hier...
    99+
    2024-04-02
  • 聊聊配置 Nginx 访问与错误日志的问题
    目录配置Nginx访问日志配置错误日志日志文件的位置读取和理解Nginx日志文件Nginx是一个开放源代码的高性能HTTP和反向代理服务器,负责处理Internet上某些最大站点的负...
    99+
    2024-04-02
  • 聊聊如何打印GC日志排查的问题
    目录如何打印GC日志排查问题先来看个示例那么上面打印出来的日志,具体是什么意思呢?小结一下gc日志打印时间戳如何打印GC日志排查问题 在工作当中,有时候我们会需要打印GC的相关信息来...
    99+
    2024-04-02
  • 如何保存Unity中的Log日志
    代码中的debug日志保存本地 using System.Collections; using UnityEngine; using System.IO; public cla...
    99+
    2024-04-02
  • logback如何自定义日志存储
    目录logback自定义日志存储1、配置lockback.xml2、配置自定义日志操作类3、调用方法使用logback进行系统日志记录logback自定义日志存储 1、配置lockb...
    99+
    2024-04-02
  • 聊聊SpringBoot整合Nacos自动刷新配置的问题
    目录目的环境pom配置文件代码日志测试目的 Nacos作为SpringBoot服务的注册中心和配置中心。 在NacosServer中修改配置文件,在SpringBoot不重启的情况下...
    99+
    2024-04-02
  • 解决rocketmq-client日志保存路径的问题
    rocketmq-client日志保存路径 由于使用rocketmq-client会生成一个rocketmq_client.log日志文件,一般默认存于系统盘内,且持续增长速度较快,...
    99+
    2024-04-02
  • JMeter自定义日志与日志分析的实现
    目录1 JMeter日志概览2 JMeter自定义日志3 JMeter日志分析1 JMeter日志概览 JMeter与Java程序一样,会记录事件日志,日志文件保存在bin目录中,名...
    99+
    2024-04-02
  • 聊聊通过celery_one避免Celery定时任务重复执行的问题
    在使用Celery统计每日访问数量的时候,发现一个任务会同时执行两次,发现同一时间内(1s内)竟然同时发送了两次任务,也就是同时产生了两个worker,造成统计两次,一直找不到原因。...
    99+
    2024-04-02
  • mysql数据库日志binlog保存时效问题(expire_logs_days)
    目录一、设置语法1、方法一2、方法二二、过期删除策略最后一、设置语法 1、方法一 编辑/etc/my.cnf文件,在[mysqld]节点中增加如下两行 max_binlog_size = 500M expire_logs...
    99+
    2023-03-09
    mysql数据库 mysql日志binlog保存 mysql expire_logs_days
  • logback怎么自定义指定日志文件存储目录
    这篇文章主要介绍“logback怎么自定义指定日志文件存储目录”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“logback怎么自定义指定日志文件存储目录”文章能帮助大家解决问题。logback自定义...
    99+
    2023-07-05
  • springboot自定义日志注解的实现
    前言       在之前的日志记录的写法中,我们大多是写一个工具类,在这个类里面定义日志保存的方法,然后再controller中执行请求的时候调用即可,...
    99+
    2024-04-02
  • springboot实现将自定义日志格式存储到mongodb中
    步骤如下 首先定义封装所需要的日志信息的实体类 public class MyLog { //根据需要定义字段 @Id privat...
    99+
    2024-04-02
  • python实现自定义日志的具体方法
    1、导入logging模块: import logging 2、创建日志收集器: logger = logging.getLogger(“日志收集器的name”) 3、设置日志收集器的日志级别: lo...
    99+
    2022-06-02
    python 自定义日志
  • 如何自定义Egg.js的请求级别日志
    这篇文章给大家分享的是有关如何自定义Egg.js的请求级别日志的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Egg.js 是什么Egg.js 为企业级框架和应用而生,我们希望由 ...
    99+
    2024-04-02
  • mysql数据库日志binlog保存时效问题如何解决
    本篇内容介绍了“mysql数据库日志binlog保存时效问题如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学...
    99+
    2023-03-09
    mysql binlog
  • Python重定向npm日志:解决日志问题的最佳方法?
    如果你使用过npm,你可能会遇到日志输出问题。npm将所有的日志都输出到控制台,而不是将其记录到文件中。这可能会导致在处理大型项目时,日志信息过多而难以捕捉。为了解决这个问题,我们可以使用Python来重定向npm的日志输出。 在Pyth...
    99+
    2023-06-19
    重定向 日志 npm
  • 如何解决Unity自定义组件之序列帧播放组件问题
    这篇文章主要为大家展示了“如何解决Unity自定义组件之序列帧播放组件问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决Unity自定义组件之序列帧播放组件问题”这篇文章吧。  我们知道...
    99+
    2023-06-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作