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 = 1; //是现实最后1帧

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

    //如果堆栈帧数大于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;
    }

    /// <summary>
    /// 关闭跟踪日志信息
    /// </summary>
    public void CloseTrace()
    {
    Application.logMessageReceivedThreaded -= Application_logMessageReceivedThreaded;
    streamWriter.Dispose();
    streamWriter.Close();
    fileStream.Dispose();
    fileStream.Close(http://www.amjmh.com/v/BIBRGZ_558768/);
    }
    /// <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;
    }

    }

  • 相关阅读:
    【BIGEMAP一键离线地图服务】
    android 应用签名的作用
    UniPush使用指南
    Android平台云端打包证书使用说明
    Android平台签名证书(.keystore)生成指南
    时序数据库技术体系-时序数据存储模型设计(原理)
    时序数据库技术体系 – 初识InfluxDB(原理)
    Influxdb原理详解
    jquery.easing 和 jquery.transit 动画插件的使用
    vue 移动端日期选择组件 vue-mobile-calendar
  • 原文地址:https://www.cnblogs.com/hyhy904/p/11661040.html
Copyright © 2011-2022 走看看