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 日志收集技巧
首先这里要收集的日志是容器的日志,而不是集群状态的日志 要完成的三个点,收集,监控,报警,收集是基础,监控和报警可以基于收集的日志来作,这篇主要实现收集 不想看字的可以直接看代码,一共没几行,尽量用调 ...
随机推荐
- linux命令后台运行[转]
有两种方式: 1. command & : 后台运行,你关掉终端会停止运行 2. nohup command & : 后台运行,你关掉终端也会继续运行 一. 简介 ...
- 3_1 wp8应用生命周期与导航事件[wp8特色开发与编程技巧]
3_1生命周期 大家好,我是徐文康,今天我们来讨论一下应用程序的生命周期,首先打开app.xaml.cs文件我们可以看到这里有几个已经为我们写好的事件. Launching 应用程序启动 Acti ...
- 9.配置postfix空客户端
将本地邮件服务器配置充当为控客户端,已将所有邮件都转发到中央服务器以进行发送 1.postconf -e "relayhost=[mail.example.com]" 邮件被路由到 ...
- Raphael画圆弧
paper.path([pathString]) A 椭圆 (rx ry x-axis-rotation larg-arc sweep-flag x y) 参数 rx 椭圆的横轴 ry 椭圆的纵轴 ...
- C# 带进度条的文件下载
private long fileLength; private long downLength;//已经下载文件大小,外面想用就改成公共属性 private static bool stopDown ...
- WebApp遇到的一些坑
一.关于js 1. 引用zepto.js时,借用插件swipe时,写的滑动加载,在ios上可以实行滑动加载数据,但是在安卓上,就是不能滑动: 注: 在使用插件的时候,要先注意其兼容性问题. 2. 用j ...
- sql server 查询多个不关联表且对结果编号
1.除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图.内联函数.派生表.子查询和公用表表达式中无效. 解决方法:top 100 percent * 2.如何对查询结果编 ...
- [转]AIX下调整分区大小
AIX下调整文件系统大小 - [work] 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://wangsuiri.blogbus.com/logs/35448074.htm ...
- 【PHP】phpcms 关联连接修复
function _keylinks($txt, $replacenum = '',$link_mode = 1) { $keywords = $this->data['keywords']; ...
- python 字典内置方法get应用
python字典内置方法get应用,如果我们需要获取字典值的话,我们有两种方法,一个是通过dict['key'],另外一个就是dict.get()方法. 今天给大家分享的就是字典的get()方法. 这 ...