Unity3D Log 收集机制

    最近做项目的时候发现,需要有一个完整的log机制。这样不仅方便调试而且方便观察。

一、需求

  目前我认为一个完善的log机制应该是这样的。

  一、双击定位

  二、生命周期是全局的

  三、输出包括consloe 和 log 日志,并且这些log的打印是可配置的。

  四、未完待续,如果你有更好的想法,请留言。

二、代码实现

  不废话,直接上代码

  

using UnityEngine;
using System;
using System.Text;
using System.IO;
using System.Collections;

namespace LogUtil {

    public class LogManager : MonoBehaviour
    {
        //public
        static string LogPath = Application.persistentDataPath + "/";

        //public
        static string LogFilePath = string.Format("{0}{1}", LogPath, "info");
        //public
        static int infoCount = 0;

        //public
        static string LogWaringFilePath = string.Format("{0}{1}", LogPath, "waring");
        //public
        static int waringCount = 0;

        //public
        static string LogErrorFilePath = string.Format("{0}{1}", LogPath, "error");
        //public
        static int errorCount = 0;

        //public
        static string LogExceptionFilePath = string.Format("{0}{1}", LogPath, "exception");
        //public
        static int exceptionCount = 0;

        static LogManager _instance = null;

        //创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数
        static LogManager()
        {
            GameObject tmp = new GameObject("LogManager");
            DontDestroyOnLoad(tmp);
            _instance = tmp.AddComponent<LogManager>();
            //Debug.Log("LogManager");
        }

		//配置是否生成Log日志
        public static bool IsRegister = true;
		//配置是否控制台打印
        public static bool IsLog = true;
        void Awake()
        {
            //register callback
            if (IsRegister) Application.RegisterLogCallbackThreaded(OutPutLog);
        }

        public static void Log(object message)
        {
            if (IsLog) Debug.Log(message);
        }

        public static void LogError(object message)
        {
            if (IsLog) Debug.LogError(message);
        }

        public static void LogWarning(object message)
        {
            if (IsLog) Debug.LogWarning(message);
        }

        public static void LogException(Exception message)
        {
            if (IsLog) Debug.LogException(message);
        }

        public static void LogException(string message)
        {
            if (IsLog) Debug.LogException(new Exception(message));
        }

        FileStream logStream = new FileStream(string.Format("{0}.log", LogFilePath), FileMode.Create);
        FileStream warningStream = new FileStream(string.Format("{0}.log", LogWaringFilePath), FileMode.Create);
        FileStream errorStream = new FileStream(string.Format("{0}.log", LogErrorFilePath), FileMode.Create);
        FileStream exceptionStream = new FileStream(string.Format("{0}.log", LogExceptionFilePath), FileMode.Create);

        public void OutPutLog(string condition, string stackTrace, LogType type)
        {

            string curTime = DateTime.Now.ToString();
            string hint = string.Format("{0} [{1}] {2}\n{3}\n", curTime, type.ToString(), condition, stackTrace);
            byte[] buffer = Encoding.UTF8.GetBytes(hint);

            switch (type)
            {
                case LogType.Error:

                    if (errorStream != null)
                    {
                        errorStream.Write(buffer, 0, buffer.Length);

                        if (errorStream.Length > 1024 * 1024)
                        {
                            errorStream.Close();

                            File.Move(string.Format("{0}.log", LogErrorFilePath), string.Format("{0}_{1}.log", LogErrorFilePath, waringCount++));

                            errorStream = new FileStream(string.Format("{0}.log", LogErrorFilePath), FileMode.Create);
                        }
                    }

                    break;
                case LogType.Exception:

                    if (exceptionStream != null)
                    {
                        exceptionStream.Write(buffer, 0, buffer.Length);

                        if (exceptionStream.Length > 1024 * 1024)
                        {
                            exceptionStream.Close();

                            File.Move(string.Format("{0}.log", LogExceptionFilePath), string.Format("{0}_{1}.log", LogExceptionFilePath, waringCount++));

                            exceptionStream = new FileStream(string.Format("{0}.log", LogExceptionFilePath), FileMode.Create);
                        }
                    }

                    break;
                case LogType.Log:

                    if (logStream != null)
                    {
                        logStream.Write(buffer, 0, buffer.Length);

                        if (logStream.Length > 1024 * 1024)
                        {
                            logStream.Close();

                            File.Move(string.Format("{0}.log", LogFilePath), string.Format("{0}_{1}.log", LogFilePath, infoCount++));

                            logStream = new FileStream(string.Format("{0}.log", LogFilePath), FileMode.Create);
                        }
                    }
                    break;
                case LogType.Warning:

                    if (warningStream != null)
                    {
                        warningStream.Write(buffer, 0, buffer.Length);

                        if (warningStream.Length > 1024 * 1024)
                        {
                            warningStream.Close();

                            File.Move(string.Format("{0}.log", LogWaringFilePath), string.Format("{0}_{1}.log", LogWaringFilePath, waringCount++));

                            warningStream = new FileStream(string.Format("{0}.log", LogWaringFilePath), FileMode.Create);
                        }
                    }

                    break;
                default:
                    break;
            }
        }

    }

}

三、完善

  上述的代码基本实现了2,3的需求功能,但是1的双击定位问题却带来了。

  我们可以封装成一个dll,然后就解决了这个问题。

  参考链接如下 注意引用UnityEngine这个链接即可

   http://www.cnblogs.com/errorx/archive/2011/03/29/1999170.html

http://game.ceeger.com/Manual/UsingDLL.html
     file:///C:/Unity3D/Editor/Data/Documentation/html/en/Manual/UsingDLL.html

  

  我把那个类库建在自己的工程目录下,按F6 生成dll

  

放入自己的工程就可以了。原来的cs文件记得删除哟!

 

四、资料

  我把dll与源码共享出来,如果有更好的修改方式,你也可以完善。

  http://yunpan.cn/Q7dukcFjA3tAv  访问密码 ed22

时间: 2025-01-01 03:02:26

Unity3D Log 收集机制的相关文章

RTP 记录 log 的机制

我们 RCV 这边经常跑的一个concurrent request RTP: Receiving Transaction Processor, 主要是用来处理 RCV_TRANSACTIONS_INTERFACE 里面的数据的. 这个 concurrent program 里面包含许多文件, 比较重要的有: ident RVCTP RVCTP: $Header: rvctp.oc 120.0.12000000.1 2007/01/16 23:53:49 appldev ship $ $Heade

Unity3d Log

adb logcat -d > logcat.txt adb logcat -s Unity adb logcat Unity3d Log,布布扣,bubuko.com

unity3d log管理

unity3d的log管理,主要区分log的重要程度,有时候习惯在项目开发过程中随意打log,到后期出现log比较多且混乱的情况,在真机上调试的时候也会很不方便. 这里记录下最近写的一个Log管理类,还有很大的优化空间,以后有时间在详细弄下. public enum LogLevel //Log等级 { Everything, Normal, Important, Emergy } public enum LogColor //Log颜色 { White, Red, Yellow, Blue,

android log写入机制

这几天和华为的leader面试了下.感觉不错.关键是小女.不容易.是技术面啊.我说的不容易不是面试不容易,是说在华为写代码的小女不容易.哥走南闯北这么多年,女人代码写的好真不多. 其实在任何时候,只要一面试都感觉自己会的少.都这样.那只能不断的增强能力.开始重点转入native code的学习.今天和大家聊聊log机制,这个东西也不容易.今天只谈谈log如何被写到驱动里, 有人说这个比较容易,要打log,在java里直接Log.d Log.i Log.e就可以了.嗯,不错,那问题来了. 1 ja

Cocos2d-x之Log输出机制

|   版权声明:本文为博主原创文章,未经博主允许不得转载. 在cocos2d-x中,我们使用log这个函数进行输出,log可以输出很多参数,它的使用方式就和使用c语言中的printf的使用方式差不多.log其实是一个跨平台的日志输出的API,它在visual stdio中,就包含visual stdio的输出API,在苹果平台使用的是NSlog,在Andriod平台使用的是Andriod平台的日志输出工具,因为在苹果和windows,phone等平台的底层所包装的输出机制是不一样的,但是因为c

Unity3D Log文件所在

官方地址:https://docs.unity3d.com/Manual/LogFiles.html PS.有时候Unity直接崩溃,这时候使用日志文件查看日志会是定位问题的好方法. 链接附带各种情况下的log文件路径并且分别分平台简述. 原文地址:https://www.cnblogs.com/zhang-dkln/p/11777254.html

java log收集

java 代码: package com.sohu.smc.web; /**  * Created by xuanli on 2015/4/17.  */ import com.sohu.smc.data.utils.MyStringUtils; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servl

关于Relay Log无法自动删除的问题

本文介绍了一次运维实践中relay-log长期无法自动删除的原因和解决过程 背景: 今天在运维一个mysql实例时,发现其数据目录下的relay-log 长期没有删除,已经堆积了几十个relay-log. 然而其他作为Slave服务器实例却没有这种情况. 现象分析 通过收集到的信息,综合分析后发现relay-log无法自动删除和以下原因有关. 该实例原先是一个Slave:导致relay-log 和 relay-log.index的存在 该实例目前已经不是Slave:由于没有了IO-Thread,

Unity3D游戏GC优化总结---protobuf-net无GC版本优化实践

protobuf-net优化效果图 protobuf-net是Unity3D游戏开发中被广泛使用的Google Protocol Buffer库的c#版本,之所以c#版本被广泛使用,是因为c++版本的源代码不支持Unity3D游戏在各个平台上的动态库构建.它是一个网络传输层协议,对应的lua版本有两个可用的库:一个是proto-gen-lua,由tolua作者开发,另外一个是protoc,由云风开发.protobuf-net在GC上有很大的问题,在一个高频率网络通讯的状态同步游戏中使用发现GC过