Unity 自定义日志输出(基于DebugConsole)

在Unity项目的测试交付阶段,有时会碰到以下几个问题:

1 项目现场的测试人员说了一些bug情况,我会需要得到日志的信息支持从而处理,output_log.txt发过来之后,看到的却是只有初始化的一些业务日志。测试人员会告诉我:“哦!我发你之前又重启了一次程序”...output_log.txt每次程序重启都会清空重写。

2 于是我让他再触发一次bug,然后立即给当前的log文件,费了些时间,总算是复现了bug,日志给发过来了。仔细研读日志,定位到了一个函数或是语句,但是崩溃的是,这个函数可能被N个其他函数调用,而那些触发路线我没有埋日志输出,无法判断到底是从哪里进来的。

3 接着我就会埋下更多的print或debug.log,然后build一个程序发过去,让他再试。幸运的是,这下找到了问题并且解决。时间一天天过去,测试人员也回来了。我们促膝长谈,他突然提到:“哦,对了,我大前天上午大概11点半,在驻场测试的时候有触发一个bug,但是后来一直都触发不了,我知道你要output_log,我当天就启动了一次程序所以文件给你带来了”,然后我无语的是,这个文件我根本不知道哪一条语句是哪个时间点的,也没有发现error类的日志输出,所以...感谢他的敬业...

所以我所遇见过的需求,大致整理就是:

1 历史日志要能保存,不应被刷新

2 日志应该反应出其打印语句所在函数是从哪里进来的

3 日志应该要有时间戳

因此,我就用了DebugConsole.cs,关于它,可以参考:http://wiki.unity3d.com/index.php/DebugConsole,它的本有的功能就不多赘述了,我主要就是用DebugConsole.instance.Log.

主要看下面的两个地方,一个是Log函数修改,一个是新增了写文件:

public static void Log(object message)
{
    //调用堆栈的帧,堆栈跟踪
    StackTrace trace = new StackTrace(true);
    StackFrame sf = trace.GetFrame(1);
    //获取是哪个类来调用的
    string className = sf.GetMethod().DeclaringType.ToString().Split('+')[0];
    //获取是类中的那个方法调用的
    string[] method = sf.GetMethod().ToString().Split(' ');
    string methodName = method[method.Length - 1].Split('(')[0] + "(" + sf.GetFileLineNumber() + ")";//.PadRight(15);
    //得到log内容
    string logContent = "[" + System.DateTime.Now.ToString("yy/MM/dd HH:mm:ss:fff") + "] [" + className + "." + methodName + "] " + message.ToString();
    
    //Unity输出,DebugConsole输出,增加一个写文件
    UnityEngine.Debug.Log(logContent);
    DebugConsole.instance.AddMessage(logContent);
    DebugConsole.instance.WriteFileByLine("");
    DebugConsole.instance.WriteFileByLine(logContent);
}

public string _fPath;
public string _fName = "Debug.log.txt";
/// <summary>
/// 写日志的文件流处理
/// </summary>
/// <param name="str_info">日志内容</param>
public void WriteFileByLine(string str_info)
{
    _fPath = Application.streamingAssetsPath;
    StreamWriter sw;
    if (!File.Exists(_fPath + "//" + _fName))
    {
        sw = File.CreateText(_fPath + "//" + _fName);
    }
    else
    {
        sw = File.AppendText(_fPath + "//" + _fName);
    }
    sw.WriteLine(str_info);//以行为单位写入字符串  
    sw.Close();
    sw.Dispose();//文件流释放  
}

通过上述方法,算是满足了目前的需求,但是它会一直叠加,并不是理智行为,我觉得它应该拓展以下功能:

1 按照日期进行日志文件命名,以实现内容的分割。

2 定时打包日志,实现清理

3 加入日志开关

之后如果有合适的机会,我会综合之前学习框架课程中的日志模块,再整合修改。

我改过的DebugConsole.cs资源下载:Unity DebugConsole 修改版

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值