日志的分级存储让排障的效率倍增:核心日志(交易、支付、安全)永久保留,调试日志(性能采样、状态轮询)保留 7 天自动清理。分级的策略让存储的成本可控,排障的关键日志不被清理冲掉。
---日志的分级写入
local LOG_LEVELS = { core = "core_logs", debug = "debug_logs", perf = "perf_logs" }
function Log.write(level, kind, data)
local target = LOG_LEVELS[level]
if target then
QF_AppendLog(target, { kind = kind, data = data, at = os.time() })
end
end
-- 核心日志:永久保留
Log.write("core", "trade", { orderId = "xxx", amount = 1000 })
-- 调试日志:7 天自动清理
Log.write("debug", "perf_sample", { fps = 58, memory = 120 })
核心日志的写入走独立的存储通道,清理任务跳过核心级别。调试日志的写入有采样控制:全量写入在高峰期产生大量 IO,采样率 10% 在保留排障能力的同时控制写入量。日志的字段结构统一:时间戳、级别、模块、数据体,格式的一致性让查询接口可以跨级别搜索。
---日志的分级查询
function LogQuery.search(level, kind, timeRange)
local results = {}
for _, row in ipairs(QF_LoadLogs(level, timeRange)) do
if not kind or row.kind == kind then
results[#results + 1] = row
end
end
return results
end
查询按级别与类型双重过滤,时间范围支持精确到秒的检索。日志的查询接口给运维工具与客服后台分别开放,运维查全量、客服查核心级。日志的存储按月分目录,目录的滚动让文件系统不会在单目录下堆积过多文件。
日志的写入速率与存储占用按小时监控,写入的异常峰值(翻倍级)提示业务侧的异常。
分级的设计曾经让核心日志的量远超预期,交易类日志的高频写入让核心目录每天增长数GB,核心日志的采样率降至 5% 后可控。日志的清理任务曾经误删了当天的核心日志,清理的范围限定在调试级别,核心级别的日志不参与自动清理。
日志的分级标准进开发规范:什么级别的日志进哪个通道在编码时确定,级别的调整走评审。日志的查询接口给运维工具集成,运维的排障流程在工具内清结不需要登服务器查文件。日志的格式统一为 JSON,结构化的日志让查询与聚合的效率提升。
本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 行会内部的物资交换长期靠喊话:谁有强效太阳水、谁收祝福油,喊话靠缘分看见。行会商会日把内部交易固定成市集…
实战应用:用在哪里 角色存档直接输出到展示接口时,内部字段(GM 标记、风控计数、内部编号)会被一并带出去,轻则泄露信息,重…
实战应用:用在哪里 排查一个玩家的异常行为,要在十几种日志里来回 grep,一次排查半小时起步。日志检索工具按角色名聚合所有…
实战应用:用在哪里 开服首日的问题七成是低级失误:礼包配置没发、传送点没开、公告没挂。开服检查单把首日开放前的三十项检查固化…
实战应用:用在哪里 祖玛阁深处有一间密室,墙上有四块浮雕,按正确顺序踩亮才能打开暗格,顺序每天随机。序列触发设计让解谜每日一…
实战应用:用在哪里 点击传送后站在黑屏里等五秒,是切图体验最差的来源:地图资源在传送确认后才开始加载,加载完才渲染。切图预热…