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
2014-9-7 日 更新
如果你在导入和使用dll编译的时候发现了错误
估计是因为你.net框架过高,把你的类库的level 降到3.5即可
Unity3D Log 收集机制的更多相关文章
- 探索 OpenStack 之(17):计量模块 Ceilometer 中的数据收集机制
本文将阐述 Ceilometer 中的数据收集机制.Ceilometer 使用三种机制来收集数据: Notifications:Ceilometer 接收 OpenStack 其它服务发出的 noti ...
- LOG收集系统(一):原日志至收集
Date: 20140207Auth: Jin 设置一个LOG收集系统1. 收集原生(不解析,不压缩)的业务日志和WEB日志(NGINX,PHP)2. 提供给开发,测试直接阅读和下载 需求分析原生日志 ...
- RTP 记录 log 该机制
我们 RCV 在这里,经常跑concurrent request RTP: Receiving Transaction Processor, 它主要是用来处理 RCV_TRANSACTIONS_INT ...
- android log写入机制
这几天和华为的leader面试了下.感觉不错.关键是小女.不容易.是技术面啊.我说的不容易不是面试不容易,是说在华为写代码的小女不容易.哥走南闯北这么多年,女人代码写的好真不多. 其实在任何时候,只要 ...
- Cocos2d-x之Log输出机制
| 版权声明:本文为博主原创文章,未经博主允许不得转载. 在cocos2d-x中,我们使用log这个函数进行输出,log可以输出很多参数,它的使用方式就和使用c语言中的printf的使用方式差不多 ...
- JAVA分代收集机制详解
Java堆中是JVM管理的最大一块内存空间.主要存放对象实例. 在JAVA中堆被分为两块区域:新生代(young).老年代(old). 堆大小=新生代+老年代:(新生代占堆空间的1/3.老年代占堆空间 ...
- Kafka内核理解:消息的收集/消费机制
原文:https://www.cnblogs.com/daochong/p/6425762.html 一.Kafka数据收集机制 Kafka集群中由producer负责数据的产生,并发送到对应的Top ...
- [Kafka] - Kafka内核理解:消息的收集/消费机制
一.Kafka数据收集机制 Kafka集群中由producer负责数据的产生,并发送到对应的Topic:Producer通过push的方式将数据发送到对应Topic的分区 Producer发送到Top ...
- kubernets轻量 contain log 日志收集技巧
首先这里要收集的日志是容器的日志,而不是集群状态的日志 要完成的三个点,收集,监控,报警,收集是基础,监控和报警可以基于收集的日志来作,这篇主要实现收集 不想看字的可以直接看代码,一共没几行,尽量用调 ...
随机推荐
- UI4_UIToolBar
// // AppDelegate.m // UI4_UIToolBar // // Created by zhangxueming on 15/7/6. // Copyright (c) 2015年 ...
- CSS制作彩虹效果
今天看到一篇文章,说到margin的塌陷的问题,并提供了好几个例子. 自己之前还没怎么遇到过这个问题,正好来研究一下. <div class="box1"></d ...
- 9款精美别致的CSS3菜单和按钮
1.超具立体感的CSS3 3D菜单 菜单项带小图标 记得之前向大家分享过不少CSS3 3D菜单,比如CSS3 3D动画菜单 3D立方体菜单项和HTML5/CSS3自定义下拉框 3D卡片折叠动画,效果都 ...
- c++对象内存布局
这篇文章我要简单地讲解下c++对象的内存布局,虽然已经有很多很好的文章,不过通过实现发现有些地方不同的编译器还是会有差别的,希望和大家交流. 在没有用到虚函数的时候,C++的对象内存布局和c语言的st ...
- JVM调优总结 -Xms -Xmx -Xmn -Xss(转载)
堆大小设置JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理内存限制.32位系统下,一般限制在1.5G~2G:64为操作 ...
- ubuntu 停在开机界面
今天有解决了一个问题.我在win7虚拟机上装的64位的Ubuntu 12.04.忘了怎么个情况了,反正就是系统进不去了,停在了开机界面,5个点的那个. 解决方法如下: 开机的时候按住shift键,进入 ...
- jdbc 连接 mysql 获取 数据集 条数
package nona; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; im ...
- 强大的网络通信框架(不实现缓存)--第三方开源--AsyncHttpClient
AsyncHttpClient是一款比较流行的Android异步网路加载库,在github上的网址是:https://github.com/loopj/android-async-http但是Asyn ...
- 自己实现的库函数1(strlen,strcpy,strcmp,strcat)
为了便于理解和使用库函数,先把自己实现的几个函数以及测试函数呈现如下. //求字符串长度的函数int my_strlen(const char* pStr){ assert(pStr != NULL) ...
- (转)MapReduce中的两表join几种方案简介
转自:http://blog.csdn.net/leoleocmm/article/details/8602081 1. 概述 在传统数据库(如:MYSQL)中,JOIN操作是非常常见且非常耗时的.而 ...