Unity日志系统扩展:基于Unity杂货铺项目的日志分级与文件输出

Unity日志系统扩展:基于Unity杂货铺项目的日志分级与文件输出

【免费下载链接】Unity3DTraining 【Unity杂货铺】unity大杂烩~ 【免费下载链接】Unity3DTraining 项目地址: https://gitcode.com/gh_mirrors/un/Unity3DTraining

在Unity开发中,默认的Debug.Log接口虽然简单易用,但在复杂项目中会面临三大痛点:日志无分级导致重要信息被淹没、无法输出到本地文件进行离线分析、缺乏上下文标识难以定位问题。本文基于Unity3DTraining项目的实践经验,提供一套轻量级日志系统扩展方案,实现日志分级、文件输出和上下文增强功能。

日志系统现状分析

项目中大量使用原生Debug接口,如Joystick.cs中的调试代码:

Debug.Log("joystick is forbid!");
Debug.Log("OnPress:" + isPressed.ToString());

这种方式存在明显局限:所有日志均输出到控制台,无法区分错误级别;没有持久化存储,程序崩溃后难以追溯;缺乏调用堆栈和时间戳等关键上下文。

日志分级实现方案

分级接口设计

参考LuaInterface_DebuggerWrap.cs中的ILogger接口设计,实现包含5个级别的日志系统:

public static class LogSystem {
    public static void Trace(string message) => Debug.Log($"[TRACE][{Time.time}] {message}");
    public static void Info(string message) => Debug.Log($"[INFO][{Time.time}] {message}");
    public static void Warn(string message) => Debug.LogWarning($"[WARN][{Time.time}] {message}");
    public static void Error(string message) => Debug.LogError($"[ERROR][{Time.time}] {message}");
    public static void Fatal(string message) {
        Debug.LogError($"[FATAL][{Time.time}] {message}");
        // 可在此处添加崩溃处理逻辑
    }
}

分级使用示例

改造KnapsackSystem中的日志输出:

// 原代码
Debug.Log("丢弃");
Debug.LogWarning("背包已满!");

// 改造后
LogSystem.Info("丢弃物品:" + itemId);
LogSystem.Warn("背包已满,无法添加:" + itemId);

文件输出模块开发

输出路径配置

结合Unity各平台文件路径规范,选择PersistentDataPath作为日志存储目录:

private static string logPath = Application.persistentDataPath + "/logs/";

日志写入实现

使用C#文件流实现异步写入,避免阻塞主线程:

private static async void WriteToFile(string level, string message) {
    if (!Directory.Exists(logPath)) Directory.CreateDirectory(logPath);
    
    string fileName = $"log_{DateTime.Now:yyyyMMdd}.txt";
    string logLine = $"[{DateTime.Now:HH:mm:ss}][{level}]{message}\n";
    
    using (StreamWriter writer = new StreamWriter(logPath + fileName, true)) {
        await writer.WriteAsync(logLine);
    }
}

集成与应用场景

完整日志系统架构

mermaid

性能优化考量

  1. 使用对象池复用StringBuilder减少GC:
private static ObjectPool<StringBuilder> sbPool = new ObjectPool<StringBuilder>(
    () => new StringBuilder(),
    sb => sb.Clear()
);
  1. 限制日志文件大小,避免存储溢出:
if (new FileInfo(filePath).Length > 10 * 1024 * 1024) { // 10MB上限
    // 备份并创建新日志文件
}

项目资源与扩展阅读

通过这套扩展方案,可显著提升Unity项目的调试效率和问题定位能力。建议在GuideSystem等核心模块优先集成,并根据项目需求扩展日志加密、网络上传等高级功能。

【免费下载链接】Unity3DTraining 【Unity杂货铺】unity大杂烩~ 【免费下载链接】Unity3DTraining 项目地址: https://gitcode.com/gh_mirrors/un/Unity3DTraining

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值