ZLogger 高性能日志库

Unity中大型项目日志升级:ZLogger零GC高性能实践 日志系统是游戏客户端可观测性的核心基础设施,其性能与稳定性直接影响开发效率与线上质量。传统Debug.Log同步阻塞、高频GC、无结构化等缺陷,在中大型Unity项目中极易引发卡顿、热更失败甚至崩溃。ZLogger通过异步无锁环形队列、结构化日志模板、零GC分配设计,实现微秒级延迟与内存可控性,显著提升真机帧率与编辑器响应。结合命名空间分级过滤、热更安全重载、iOS/Android平台专项适配等工程实践,它已成为千万级DAU手游团队构建生产级日志管道的关键选型。 阅读详情

github源码:https://github.com/Cysharp/ZLogger/tree/master

作者两篇文章1(部分旧的不适用):https://neuecc.medium.com/zlogger-zero-allocation-logger-for-net-core-and-unity-d51e675fca76

作者两篇文章2:https://neuecc.medium.com/zlogger-v2-architecture-leveraging-net-8-to-maximize-performance-2d9733b43789

C#10 自定义内插字符串:https://devblogs.microsoft.com/dotnet/string-interpolation-in-c-10-and-net-6/

C# 源代码生成器简介:https://devblogs.microsoft.com/dotnet/introducing-c-source-generators/


概述

  • 高性能;支持模板配置;可以动态生成日志代码的日志库。

  • 可以解决常见unity日志问题:

    • 根据级别开关日志。

    • 字符串参数装箱问题。

    • 日志屏蔽不全的参数导致没必要的调用。

    • 线程异步的日志。

  • 可扩展:输出多个文件,自动生成额外参数。


和传统对比

日志开关统一

  • 平常开发打log没有统一日志库时,需要自己定义开关,通常也会漏开关,不受控。要么加宏开关,要么自己定义变量。
// 使用宏,需要代码头部定义宏,或者工程配置宏。
// 不用时,没有性能消耗,因为代码不会编译进去。就是不方便统一管理。
[Conditional("DEBUG_LOG")]
public static void DebugLog1(string str)
{
    Debug.Log($"DebugLog: {str}");
}
// 编译时,如果宏没开启,这行直接不会编译。
DebugLog1($"hello {id}");

// 自定义开关,开关可以统一。
// 不用时,还是会编译,如果参数会执行,有额外不必要开销。
// 在外面调用if判断也行,但得在所有打印日志前加if,大概率会漏。
public static void DebugLog2(string str)
{
    if (enable)
    {
         Debug.Log($"DebugLog: {str}");
    }
}
// 无论是否enable,这里都已经进行了字符串拼接了
DebugLog2($"hello2 {id}");
  • ZLogger加了一层日志包装,每个日志管理可以各自控制开关。
using var loggerFactory = LoggerFactory.Create(logging =>
{        
    // 设置输出日志的等级
    logging.SetMinimumLevel(LogLevel.Warning);
});

// 普通Log不会执行,包括参数,在编译时会调整
logger.Log(LogLevel.Information, $"Log {id}");

字符串装箱问题

  • 传统日志没有特殊处理,就是String.Format处理字符串,然后传给Debug.Log方法。
    在这里插入图片描述

  • ZLogger,通过C#的自定义内插字符串(InterpolatedStringHandler),实现对特殊参数用泛型代替,避免装箱操作。源码在:ZLoggerInterpolatedStringHandler.cs
    在这里插入图片描述

实现原理

在这里插入图片描述

1、2:初始化日志信息,字符串信息,判断是否开启

在这里插入图片描述

3:从池子里取或创建字符串模板

  • $"ZLog Hello {name} your id is {id}" 的模板:

  • ["ZLog Hello ", null, " your id is ", null]
    在这里插入图片描述

4:记录上下文,方法名,文件行号等

5:输出字符串

在这里插入图片描述
在这里插入图片描述

MagicalBox

  • MagicalBox:用来避免装箱,装任意数据
    在这里插入图片描述

编译时自动生成格式化日志代码

  • 需要编译c#版本preview版本(csc.rsp文件),LangVersion.props 改版本 11

  • 比起上面的日志生成,这个更高效,但需要额外写代码,也不保证调试正常,毕竟unity没直接支持。

  • ZLoggerMessage:https://github.com/Cysharp/ZLogger/tree/master?tab=readme-ov-file#zloggermessage-source-generator

  • 类似.net支持的: https://learn.microsoft.com/en-us/dotnet/core/extensions/logger-message-generator

  • https://devblogs.microsoft.com/dotnet/introducing-c-source-generators/

在这里插入图片描述


System.Span<T>

  • 常用于直接取数组的一段数据,直接取得相同地址数据,不会额外分配内存。比如可以代替String.SubString()的功能,且不生成新的字符串。

    • 比如将 “DateTime.Now:@date:yyyy-MM-dd”,分前后两段

    在这里插入图片描述

  • 也可以用于说明数组只读性,System.ReadOnlySpan<T>:

    在这里插入图片描述

  • 操作一些编码

byte[] buffer = new byte[1024]; 
Span<byte> header = buffer.AsSpan(0, 128); // 取前128字节 
Span<byte> body = buffer.AsSpan(128);    
  • 分配临时栈内存
Span<int> stackData = stackalloc int[10]; // 栈上分配
for (int i = 0; i < stackData.Length; i++)     
{         
    stackData[i] = i;     
}

Unity高性能日志方案:ZLogger零分配与结构化实践 日志系统是游戏客户端稳定性与可维护性的基础设施,其性能瓶颈常源于字符串拼接、同步I/O和非结构化输出。ZLogger通过零分配(zero-allocation)日志事件构造、异步双缓冲刷盘及原生结构化(JSON)日志设计,显著降低GC压力与主线程阻塞风险。在Unity中,它直面Scripting Runtime兼容性、IL2CPP支持、真机沙盒权限等工程挑战,提供可分级过滤、动态开关、线程安全上下文注入等生产就绪能力。尤其适用于中大型Unity项目——当Debug.Log引发编辑器卡顿、CI构建失败或玩家闪 阅读详情

相关推荐

ZLogger:用于.NET Core和Unity的零分配TextStrcutured记录器,建立在Microsoft.Extensions.Logging的基础上

ZLogger žERO分配文本/结构化记录仪.NET的核心和团结,建立在Microsoft.Extensions.Logging的顶部。 记录到标准输出非常重要,尤其是在容器化时代(在-Logs说应该写到stdout》中进行了描述),但是传统上它的性能一直很慢,但是没有人关心它。它还支持文本日志和结构化日志,这在云日志管理中很重要。 ZLogger由我们的零分配字符串生成器直接写为UTF8。此外,还使用了完整的泛型,结构和缓存来实现最佳性能。默认选项通过异步和缓冲设置为最佳性能,因此您不必担心记录器设置。 ZLogger直接建立在Microsoft.Extensions.Logging之上。通过没有单独的记录器框架层,我们可以提取更好的性能。除了ConsoleLogging外,我们还提供FileLogger , RollingFileLogger和StreamLogger 。它们也

ZLogger 使用教程

ZLogger 是一个为 .NET 和 Unity 设计的零分配文本/结构化日志库,支持字符串插值和源代码生成器。它建立在 Microsoft.Extensions.Logging 之上,旨在提供高性能的日志记录解决方案。ZLogger 通过直接输出 UTF8 格式的日志,避免了传统日志架构中的编码开销,从而显著提高了日志记录的性能。 ## 2. 项目快速启动 ### 安装 ZLogger ...

gitblog_00435的博客 1306

A robust and easy to implement method for IMU calibration without external equipments(IMU标定)

A robust and easy to implement method for IMU calibration without external equipments 1 标定原理1 亲试可用,还有动态演示效果不错。相比商用产品的简易标定流程,该标定方法有以下几点不同: 给出了加速度计和陀螺仪更复杂的模型。 利用Allan方差的定义,标定陀螺仪的偏置。 大量冗余数据,保证最优化收敛。利用数十...

擦擦擦大侠的博客 3949

探索ZLogger:高性能的.NET和Unity日志库

探索ZLogger:高性能的.NET和Unity日志库 ZLogger Zero Allocation Text/Structured Logger for .NET with StringInterpolation and Source Generator, built on top of a Microsoft.Ex...

gitblog_00014的博客 569

TSmaster CANFD配置避坑指南:为什么你的PCAN盒不支持最新版本?

本文针对TSmaster配置PCAN硬件进行CANFD通信时的常见问题,提供了详细的避坑指南。重点解析了CANFD配置中TSEG1等关键参数的理解误区,并深入探讨了TSmaster新版本与PCAN硬件驱动之间的兼容性变化,帮助工程师快速定位并解决连接失败或无法发送CANFD报文等问题。

alpha的博客 543

用Zotero+B站Kimi,我如何把一篇顶会论文快速做成组会PPT(含完整提示词)

本文介绍如何利用Zotero和Kimi快速将顶会论文转化为组会PPT,提升学术汇报效率。通过Zotero的文献管理插件和Kimi的AI提炼技术,实现从论文阅读到PPT生成的全流程自动化,帮助研究者在90分钟内完成高质量汇报准备。

weixin_30955617的博客 500

ZLogger:高性能零分配日志库

**NuGet 包**:[ZLogger NuGet](https://www.nuget.org/packages/ZLogger)

gitblog_00162的博客 1085

Vivado实战:AXI转PCIe IP核配置全流程(含性能优化技巧)

本文详细介绍了在Vivado环境中配置AXI转PCIe IP核的全流程,包括工程准备、IP核参数设置、BAR空间配置、中断系统优化以及TLP传输效率提升等关键步骤。特别分享了经过验证的性能优化技巧,帮助开发者显著提升PCIe链路的吞吐量和稳定性,适用于视频采集、高速数据记录等应用场景。

weixin_30892037的博客 552

简单两步使用Unity制作ZigZag游戏

原文链接:http://forum.china.unity3d.com/forum.php?mod=viewthread&tid=20816&extra=page%3D1%26filter%3Dtypeid%26typeid%3D18&ordertype=1 这个教程比较简单,算是入门级别的,但是挺好玩的,如图是我制作的效果

赖张殷-Eagle 1568

从封装到先进封装:一文讲透Chiplet、2.5D/3D堆叠与系统集成

封装是芯片产业链中连接硅片与电路板的桥梁,承担物理保护、电气连接、散热与机械支撑等核心任务。传统封装从DIP、QFP发展到BGA,通过提升引脚密度满足早期性能需求。随着摩尔定律放缓,单纯缩小晶体管尺寸难以为继,先进封装应运而生,其核心理念从“封装单颗芯片”转向“系统级高密度集成”。扇出型封装、2.5D硅中介层、3D堆叠、Chiplet和系统级封装等技术,通过微米级互连和垂直堆叠,大幅提升I/O密度与带宽,成为AI芯片、HBM存储、高性能计算等领域的关键支撑。本文梳理先进封装的技术演进、分层架构与工程难点,帮

weixin_29185167的博客 369

zabbix深度监控之邮件告警、微信群和微信告警

本文详细介绍了Zabbix监控系统实现邮件告警和微信告警的配置方法。邮件告警部分包含QQ和163邮箱的SMTP服务器配置、消息模板设置、告警流程三步骤(媒介配置、触发器动作、用户设置)。微信告警分为两种方式:企业微信群机器人告警(通过webhook实现)和企业微信应用告警(需创建应用并获取API参数)。两种告警方式都提供了完整的配置流程,包括脚本编写、权限设置、消息模板定制等关键步骤,并特别说明了如何使个人微信接收企业微信告警消息。文章还对比了SMTP、POP3、IMAP三种邮件协议的差异及适用场景。

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 816

ZLogger与Unity集成:游戏开发中的高性能日志解决方案

ZLogger是一款基于Microsoft.Extensions.Logging构建的零分配文本/结构化日志库,特别针对.NET平台优化,通过StringInterpolation和Source Generator技术实现高效日志处理。在游戏开发中,尤其是Unity项目,高性能日志解决方案至关重要,ZLogger与Unity的集成能够显著提升日志系统的性能和可靠性。 ## 为什么选择ZLogge

gitblog_00287的博客 437

RK3588芯片CAN总线调试秘籍:SocketCAN与错误帧攻略

RK3588芯片在嵌入式领域凭借8nm工艺和强大性能成为核心控制器。本文详细介绍了其CAN总线配置流程,包括硬件连接、内核驱动配置及SocketCAN命令操作,并深入解析了CAN通信中的错误帧机制及分析方法。通过智能工厂案例,展示了从问题定位到解决方案的全过程,强调了稳定通信对工业应用的重要性。文章为RK3588的CAN总线应用提供了实用技术参考,并对未来智能诊断技术在该领域的应用进行了展望。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 518

ZLogger最佳实践:从开发到部署的完整日志管理流程

ZLogger是一款基于Microsoft.Extensions.Logging构建的零分配文本/结构化日志库,专为.NET开发打造,通过StringInterpolation和Source Generator技术实现高效日志记录。本文将带您探索从开发配置到部署优化的完整日志管理流程,帮助您充分发挥ZLogger的性能优势。 ## 为什么选择ZLogger? 在现代应用开发中,日志系统的性能和

gitblog_00147的博客 450

Fiori Elements 表格之 Tree Tables:从数据建模到交互行为的全链路剖析

SAP Fiori elements的Tree Table组件将分层数据以表格形式展示,支持展开/折叠操作,适用于组织结构、物料清单等多级数据场景。该组件在List Report和Object Page中均可使用,支持懒加载、多选、列冻结等标准表格功能,并与OData V4服务层级注解深度集成。后端需通过RAP或CAP建模提供层级数据,前端通过清单配置切换表类型。需注意在草稿模式下仅显示活动实体,且展开状态在编辑时不保留。性能方面建议采用懒加载策略,避免全量加载树节点。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 160

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Utf8StringInterpolation 项目教程

Utf8StringInterpolation 项目教程 项目介绍 Utf8StringInterpolation 是一个专注于生成和写入 UTF-8 字符串的 C# 库。它利用 C# 编译器的特性进行自定义字符串插值,提供类似于 StringBuilder 的连续写入功能。该库是 ZString 的继任者,基于 UTF-8 编码,实现了零分配和高性能的字符串插值和 StringBuilder。 ...

gitblog_00485的博客 563

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

探索ZLogger:跨平台的远程持久键记录器

探索ZLogger:跨平台的远程持久键记录器 在数字时代的洪流中,监控与日志管理成为了保障系统安全、进行应用故障排查的重要工具之一。今天,我们要向大家推荐一个特别的技术解决方案——ZLogger,一款简洁而强大的远程持久键记录器,专为Windows和Linux两大操作系统设计。 项目介绍 ZLogger,正如其名,是一个专注于键盘活动跟踪的开源工具,它轻量级且功能高效,能够在无需root或管理员权...

gitblog_00006的博客 500

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Dialogic 2深度解析:构建专业级视觉小说游戏的全栈解决方案

Dialogic 2作为Godot引擎中功能最全面的对话系统框架,为游戏开发者提供了从角色管理到剧情编排的一站式创作平台。这个开源工具不仅简化了对话系统的实现流程,更通过模块化设计为视觉小说、RPG和互动叙事游戏提供了专业级的开发体验。无论你是独立开发者还是团队项目,Dialogic 2都能帮助你快速构建引人入胜的叙事体验。 ## 核心架构:模块化设计的对话引擎 Dialogic 2采用高度模

gitblog_00405的博客 415

ZLogger v2 架构:利用 .NET 8 最大限度地提高性能

这是一个用于 C# 和 .NET 的新的超快速和低分配日志记录库。它已从 v1 开始完全重新设计,以与最新的 C# 功能保持一致。虽然它最适合 .NET 8,但它支持 .NET Standard 2.0 及更高版本,以及 Unity 2022.2 及更高版本。.NET 和 Unity 版本都支持文本消息和结构化日志记录(默认为 JSON 和 MessagePack)。Cysharp/ZLogger...

dotNET跨平台 455

基于多线程的高性能异步日志管理机制与实现

通常在日志写的过程,每次写日志时,都是直接写入文件中。当数据量不大的时候,完成可以这样做,不会有什么问题。但是当数据量大时,每次写数据则会由于IO的瓶颈造成很大的性能问题。 为了解决这个问题,本文设计了一套基于多线程的在内存中追加日志后再写入文件的缓冲机制,从而解决这个问题。 基本原理 内存日志列表 首先建立一个缓冲列表用于保存日志。当日志在生成以后,先写入缓冲中,从而利用高速的内存可以以极高的...

郝伟老师的博客——大数据、并行计算与人工智能时代 1440

.net core 日志引擎 ILogger接口与使用

ILogger接口与使用 https://github.com/aspnet/Logging core 日志项目地址 1.配置IDE可调试core 源码 .net core源码都是开放的,配置的目的是为了调试的时候可以直接步进.core源码,方便查看框架内部实现方式。 效果 2.日志记录器简单使用 2.1 配置日志提供器 2.2 注入需要记录日志的...

猫妖九尾 2万+

.NET C# 高性能日志类

.NET C# 高性能日志类,主要采用队列的方式将需要写入的日志记录排队,由独立的线程完成异步写入。 这样可避免在阻塞调用日志类的线程。 下面贴出核心代码,希望大家共同讨论。   using System; using System.Collections.Generi

西蒙吹牛 4201

Qogir-theme支持哪些桌面环境?完整兼容性列表与配置技巧

Qogir-theme是一款采用扁平化设计的GTK主题,为Linux桌面环境提供现代简约的视觉体验。本文将详细介绍Qogir-theme支持的桌面环境兼容性列表及实用配置技巧,帮助用户快速部署和个性化这款主题。 ## 一、核心兼容性列表 🖥️ Qogir-theme通过模块化设计支持多种主流桌面环境,以下是经过验证的兼容环境: ### 1. GNOME Shell - **支持版本**:3

gitblog_01187的博客 533

ZLogger

ZLogger.hpp //z 2014-07-15 16:43:51 L.169'26169 BG57IV3@XCL T1740119909.K.F1752546504[T1,L73,R1,V21] #pragma once class ZLogger { public: //z gnu log level : DEBUG < INFO < WARN &lt...

214

完全掌握3D高斯泼溅技术:从零基础到高效渲染的完整实战指南

3D高斯泼溅技术正在革命性地改变计算机图形学领域,而**gsplat**作为这一前沿技术的开源实现,通过CUDA加速带来了前所未有的性能突破。无论你是计算机视觉新手还是经验丰富的开发者,本指南都将带你全面掌握**3D高斯泼溅**的核心原理和实战应用,让你能够快速上手并应用于实际项目中。 ## 🌟 核心理念:重新定义3D场景表示 ### 什么是3D高斯泼溅? 想象一下,传统3D渲染就像用乐高

gitblog_01068的博客 666
上一篇: Git 源码编译,冲突对比异常排查
下一篇: 打Tag傻瓜工具
ChiLi_Lin
博客等级 码龄12年 760粉丝 184原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值