模块代码整理自 http://gad.qq.com/lore/catalog/10007

Debugger类。提供打印日志的静态方法。

using System;
using System.IO; namespace UnityEngine
{
/// <summary>
/// 系统日志模块
/// </summary>
public class Debugger
{
public static bool EnableLog; // 是否启用日志,仅可控制普通级别的日志的启用与关闭,LogError和LogWarn都是始终启用的。
public static bool EnableTime = true;
public static bool EnableSave = false; // 是否允许保存日志,即把日志写入到文件中
public static bool EnableStack = false;
public static string LogFileDir = Application.persistentDataPath + "/DebuggerLog/";
public static string LogFileName = "";
public static string Prefix = "> "; // 用于与Unity默认的系统日志做区分。本日志系统输出的日志头部都会带上这个标记。
public static StreamWriter LogFileWriter = null;
public static bool UseUnityEngine; private static string GetLogText(string tag, string message)
{
string str = "";
if (EnableTime)
{
str = DateTime.Now.ToString("HH:mm:ss.fff") + " ";
}
return (str + tag + "::" + message);
} private static string GetLogTime()
{
string str = "";
if (EnableTime)
{
str = DateTime.Now.ToString("HH:mm:ss.fff") + " ";
}
return str;
} public static void Log(object message)
{
if (!Debugger.EnableLog)
return; string str = GetLogTime() + message;
Debug.Log(Prefix + str, null);
LogToFile("[I]" + str, false);
} public static void Log(object message, Object context)
{
if (!Debugger.EnableLog)
return; string str = GetLogTime() + message;
Debug.Log(Prefix + str, context);
LogToFile("[I]" + str, false);
} public static void Log(string tag, string message)
{
if (!Debugger.EnableLog)
return; message = GetLogText(tag, message);
Debug.Log(Prefix + message, null);
LogToFile("[I]" + message, false);
} public static void Log(string tag, string format, params object[] args)
{
if (!Debugger.EnableLog)
return; string logText = GetLogText(tag, string.Format(format, args));
Debug.Log(Prefix + logText, null);
LogToFile("[I]" + logText, false);
} public static void LogError(object message)
{
string str = GetLogTime() + message;
Debug.Log(Prefix + str, null);
LogToFile("[E]" + str, true);
} public static void LogError(object message, Object context)
{
string str = GetLogTime() + message;
Debug.Log(Prefix + str, context);
LogToFile("[E]" + str, true);
} public static void LogError(string tag, string message)
{
message = GetLogText(tag, message);
Debug.Log(Prefix + message, null);
LogToFile("[E]" + message, true);
} public static void LogError(string tag, string format, params object[] args)
{
string logText = GetLogText(tag, string.Format(format, args));
Debug.Log(Prefix + logText, null);
LogToFile("[E]" + logText, true);
} /// <summary>
/// 将日志写入到文件中
/// </summary>
/// <param name="message"></param>
/// <param name="EnableStack"></param>
private static void LogToFile(string message, bool EnableStack = false)
{
if (!Debugger.EnableSave)
return; if (LogFileWriter == null)
{
LogFileName = DateTime.Now.GetDateTimeFormats('s')[].ToString();
LogFileName = LogFileName.Replace("-", "_");
LogFileName = LogFileName.Replace(":", "_");
LogFileName = LogFileName.Replace(" ", "");
LogFileName = LogFileName + ".log";
if (string.IsNullOrEmpty(LogFileDir))
{
try
{
if (UseUnityEngine)
{
LogFileDir = Application.persistentDataPath + "/DebuggerLog/";
}
else
{
LogFileDir = AppDomain.CurrentDomain.BaseDirectory + "/DebuggerLog/";
}
}
catch (Exception exception)
{
Debug.Log(Prefix + "获取 Application.persistentDataPath 报错!" + exception.Message, null);
return;
}
}
string path = LogFileDir + LogFileName;
try
{
if (!Directory.Exists(LogFileDir))
{
Directory.CreateDirectory(LogFileDir);
}
LogFileWriter = File.AppendText(path);
LogFileWriter.AutoFlush = true;
}
catch (Exception exception2)
{
LogFileWriter = null;
Debug.Log("LogToCache() " + exception2.Message + exception2.StackTrace, null);
return;
}
}
if (LogFileWriter != null)
{
try
{
LogFileWriter.WriteLine(message);
if ((EnableStack || Debugger.EnableStack) && UseUnityEngine)
{
LogFileWriter.WriteLine(StackTraceUtility.ExtractStackTrace());
}
}
catch (Exception)
{
}
}
} public static void LogWarning(object message)
{
string str = GetLogTime() + message;
Debug.Log(Prefix + str, null);
LogToFile("[W]" + str, false);
} public static void LogWarning(object message, Object context)
{
string str = GetLogTime() + message;
Debug.Log(Prefix + str, context);
LogToFile("[W]" + str, false);
} public static void LogWarning(string tag, string message)
{
message = GetLogText(tag, message);
Debug.Log(Prefix + message, null);
LogToFile("[W]" + message, false);
} public static void LogWarning(string tag, string format, params object[] args)
{
string logText = GetLogText(tag, string.Format(format, args));
Debug.Log(Prefix + logText, null);
LogToFile("[W]" + logText, false);
} }
}

DebuggerExtension类。采用C#的扩展方法特性,使所有System.Object子类获得了打印日志的函数功能。

using System.Diagnostics;
using System.Reflection;
using UnityEngine; namespace UnityEngine
{
/// <summary>
/// 日志模块的扩展类
/// </summary>
public static class DebuggerExtension
{
/// <summary>
/// LogTag是调用打印日志的类中自定义的常量字符串,通常情况下LogTag是类名。
/// 用LogTag可以直观地看出这条日志是哪个类输出的。
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
private static string GetLogTag(object obj)
{
FieldInfo field = obj.GetType().GetField("LOG_TAG");
if (field != null)
{
return (string)field.GetValue(obj);
}
return obj.GetType().Name;
} [Conditional("EnableLog")]
public static void Log(this object obj, string message)
{
if (Debugger.EnableLog)
{
Debugger.Log(GetLogTag(obj), message);
}
} [Conditional("EnableLog")]
public static void Log(this object obj, string format, params object[] args)
{
if (Debugger.EnableLog)
{
string message = string.Format(format, args);
Debugger.Log(GetLogTag(obj), message);
}
} public static void LogError(this object obj, string message)
{
Debugger.LogError(GetLogTag(obj), message);
} public static void LogError(this object obj, string format, params object[] args)
{
string message = string.Format(format, args);
Debugger.LogError(GetLogTag(obj), message);
} public static void LogWarning(this object obj, string message)
{
Debugger.LogWarning(GetLogTag(obj), message);
} public static void LogWarning(this object obj, string format, params object[] args)
{
string message = string.Format(format, args);
Debugger.LogWarning(GetLogTag(obj), message);
} }
}

Example测试日志模块。

using UnityEngine;

public class Example_Debugger : MonoBehaviour
{
void Start()
{
Debug.Log("这是Unity默认的日志!"); Debugger.EnableLog = true;
Debugger.EnableTime = true; Debugger.Log("Debugger.Log");
Debugger.LogWarning("Debugger.LogWarning");
Debugger.LogError("Debugger.LogError"); Debugger.Log("Example_Debugger", "格式化日志: {0}", );
Debugger.Log("日志保存路径:", Debugger.LogFileDir); this.Log("日志扩展类中的方法。该方法需要在Unity编辑器中添加宏命令EnableLog才能被编译!");
} }

运行效果:

注意,DebuggerExtension类采用了[Conditional]特性条件编译,被[Conditional]标记的函数需要在Unity编辑器中开启命令宏才能被编译,参考这里

建议将Debugger类和DebuggerExtension类都编译到Debugger.dll中,再放入Unity工程Asset目录下使用。因为如果将Debuger类放到主工程里,在Unity的日志输出窗口Console中点击日志,会跳转到Debuger类中的代码,而我们真正想要跳转到的是调用了Debuger的地方。

【Unity】通用的Debugger日志模块的更多相关文章

  1. 【腾讯Bugly干货分享】微信mars 的高性能日志模块 xlog

    本文来自于腾讯bugly开发者社区,未经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/581c2c46bef1702a2db3ae53 Dev Club 是一个交流移动 ...

  2. 搭建一套自己实用的.net架构(2)【日志模块-log4net】

    先谈谈简单的模块,日志.在系统中日志模块是必须的,什么系统日志,操作日志,调试日志.这里用的是log4net. 对log4net还不熟悉的小伙伴们赶快去搜索基础教程哦, 我这里就不温故了. 那么有人要 ...

  3. 【腾讯Bugly干货分享】微信终端跨平台组件 mars 系列(一) - 高性能日志模块xlog

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57ff5932cde42f1f03de29b1 本文来源: 微信客户端开发团队 ...

  4. step by step 之餐饮管理系统五(Util模块)------附上篇日志模块源码

    这段时间一直在修改日志模块,现在基本上写好了,也把注释什么的都加上了,昨天邮件发送给mark的园友一直报失败,老是退回来,真是报歉,如下图所示:

  5. step by step 之餐饮管理系统四(日志模块实现)

    三天前基本上把数据库表设计的文档写好,今天想到了一个问题,还要再加几个表,一个是log表,用来记录系统日志,另外再加几个字典表,一些需要配置的数据但又不好放在像xml文件里面的数据可以放在这些字典表里 ...

  6. 像素迷踪,当Unity的Frame Debugger力不从心时

    http://www.manew.com/thread-92382-1-1.html 从版本5开始,Unity包含了一个全新的可视化帧调试工具,Frame Debugger.该工具能帮你解决很多图形方 ...

  7. nginx日志模块、事件模块

    日志模块 1.access_log指令 语法: access_log path [format [buffer=size [flush=time]]]; access_log logs/access. ...

  8. python基础编程:生成器、迭代器、time模块、序列化模块、反序列化模块、日志模块

    目录: 生成器 迭代器 模块 time 序列化 反序列化 日志 一.生成器 列表生成式: a = [1,2,3,3,4,5,6,7,8,9,10] a = [i+1 for i in a ] prin ...

  9. Python 日志模块 logging通过配置文件方式使用

    vim logger_config.ini[loggers]keys=root,infoLogger,errorlogger [logger_root]level=DEBUGhandlers=info ...

随机推荐

  1. Redis自学笔记:2.准备

    第2章:准备 '纸上得来终觉浅,绝知此事要躬行'--陆游 2.2启动和停止redis 表2-1 redis可执行文件说明 文件名 说明 redis- server redis服务器 redis-cli ...

  2. [USACO07NOV]牛栏Cow Hurdles

    OJ题号:洛谷2888 思路:修改Floyd,把边权和改为边权最大值.另外注意是有向图. #include<cstdio> #include<algorithm> using ...

  3. 32位系统和x86的关系?

    32位操作系统针对32位CPU设计,cpu的位是指一次性可处理的数据量是多少,也等于寻址空间的大小或是通用寄存器的大小,一般数据总线的宽度也和cpu位数相同,但也有例外(如8088数据总线宽度为8然而 ...

  4. dd制作linux启动盘

    1.fdisk /dev/sdb 删除分区,新建分区 2.mkfs.vfat /dev/sdb1 3.dd bs=4M if=CentOS.iso of=/dev/sdb

  5. .net 相关性能计数器丢失问题解决方案

    1.开始运行:cmd 2.在cmd窗口中执行下面命令: cd c:\windows\system32 lodctr /R 执行完上面命令,会提示:“信息: 成功地从系统备份存储中重建性能计数器设置” ...

  6. Centos7——NFS(Network File System)服务

    NFS(Network File System)即网络文件系统,允许计算机之间通过网络共享资源:在NFS客户端即可NFS服务端所共享的目录挂载到本地,此时即可像读写本地目录一样读写远程计算机的目录与文 ...

  7. 3_主流部署方式介绍-Django+gunicorn+nginx

    下载python wgethttps://www.python.org/ftp/python/3.4.3/Python-3.4.3.tgz 报错 Cannot find a valid baseurl ...

  8. poj3276 Face The Right Way(反转问题,好题)

    https://vjudge.net/problem/POJ-3276 首先意识到,对一个区间进行两次及以上的反转是没有意义的,而且反转次序不影响最终结果. 有点像二分搜索时用的逐个试的方法,每次翻的 ...

  9. Git 和 Repo常用命令

    这篇博客总结的也不错: git常用及进阶命令总结 Git与Repo入门 一.初始環境配置 git config --global user.name "John Doe"git c ...

  10. 解决telnet无法连接 Connection refused

    telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式.它为用户提供了在本地计算机上完成远程主机工作的能力.在终端使用者的电脑上使用telnet程序,用它连接 ...