【直播切片工作台】第7章:日志系统

简介: 本章详解日志系统设计:基于 Zap + Lumberjack 实现结构化、分级、自动轮转(按大小/保留份数),统一 `job_id` 等字段便于排障,支持 JSON/console 双格式与优雅降级,67 行代码兼顾健壮性与可观测性。(239字)

第7章:日志系统

本章分析 internal/bootstrap/logger.go:zap 核心如何组装、lumberjack 如何做文件轮转、格式与级别如何配置,以及全仓库统一的日志书写范式。日志是长任务系统唯一的「黑盒观测窗口」,这里的每个选择都服务于排障效率。

流程

日志初始化发生在 main 的第二位(仅次于配置)。InitLogger(cfg) 的流水线是:解析级别字符串(非法值回落 Info)→ 落实三个默认值(文件路径 logs/base.log、单文件 10MB、保留 10 份历史)→ 确保日志目录存在 → 组装 encoder(console 或 JSON,默认 JSON)→ 把 lumberjack.Logger 作为 zap 的 WriteSyncer → zapcore.NewCore 组合出 logger。

输入是 LoggerConfig{Level, Format, Filename, MaxSize, MaxBackups},输出是一个全局 *zap.Logger,随后注入到所有 Worker、service、draft 流水线。运行期所有关键路径都打结构化字段:job_id(任务号)、live_url、step(草稿步骤名)、removed(清理数量)——排障时按 job_id 过滤即可重放一次任务的完整轨迹。

轮转策略由 lumberjack 承担:单文件超过 MaxSize(MB)自动切分,按 MaxBackups 保留最新历史文件,超出删除。Docker 部署时 logs/ 目录挂载到宿主机 docker/logs/,容器重建日志不丢。

实现

实现只有 67 行,但细节讲究:

  • 级别解析容错:level.UnmarshalText 失败静默回落 Info——日志系统绝不能因为自己的配置错误把主服务打挂,这是基础设施的「自我牺牲」原则。
  • 默认 JSON 格式:生产环境 APP_LOGGER_FORMAT=json(compose 中显式声明),便于采集系统解析;本地调试可切 console 换取可读性。一个 encoderCfg 双格式复用(NewProductionEncoderConfig + ISO8601TimeEncoder)。
  • zap.AddCaller() + zap.AddStacktrace(ErrorLevel):所有日志带调用位置,仅 Error 级别附堆栈——常态低开销,事故时有现场。
  • logger.Sync() 在 main 里 defer(带 //nolint:errcheck):退出前刷缓冲;错误被忽略是因为进程退出时 Sync 报错无处理价值。
  • 优雅降级约定:全仓库接受 *zap.Logger 的构造函数都在 nil 时换 zap.NewNop()(scheduler、draft、各 Worker 无一例外),调用方可以不关心日志,测试无需构造 logger。

GORM 的 SQL 日志同样在 bootstrap 交给 gormlogger.Default.LogMode(gormlogger.Info)(database.go),慢查询与错误 SQL 会进入同一输出体系。

📌 设计决策

  • 文件轮转而非直写 stdout:单体部署下简单直观;代价是容器最佳实践(日志走 stdout 由 runtime 收集)没有遵循,若迁 K8s 需把 core 换为 zapcore.AddSync(os.Stdout),改动点只有一行。
  • 不引入集中式日志(ELK 等):部署复杂度优先;ISO8601 时间 + JSON 格式已为未来接入留好接口。
  • 每个 Logger 消费点都要求显式传 logger(而非全局单例):依赖清晰、单测可注入 Nop,代价是构造函数签名变长。

代码示例

完整的 core 组装——zap + lumberjack 的标准结合方式:

// internal/bootstrap/logger.go(节选)
encoderCfg := zap.NewProductionEncoderConfig()
encoderCfg.EncodeTime = zapcore.ISO8601TimeEncoder

var encoder zapcore.Encoder
if strings.ToLower(cfg.Format) == "console" {
   
    encoder = zapcore.NewConsoleEncoder(encoderCfg)
} else {
   
    encoder = zapcore.NewJSONEncoder(encoderCfg) // 默认 JSON
}

// 日志轮转:单文件最大 10MB,最多保留 10 个历史文件
fileWriter := &lumberjack.Logger{
   
    Filename:   filename,
    MaxSize:    maxSize,
    MaxBackups: maxBackups,
    LocalTime:  true,
}

core := zapcore.NewCore(encoder, zapcore.AddSync(fileWriter), level)
logger := zap.New(core, zap.AddCaller(), zap.AddStacktrace(zapcore.ErrorLevel))

业务侧的结构化书写范式(draft 流水线实例):

// internal/draft/builder.go(节选)
b.Logger.Info("草稿裁剪前合并相邻片段",
    zap.String("job_id", req.JobID),
    zap.Int("clips_before", beforeMerge),
    zap.Int("clips_after", len(clips)),
    zap.Int64("merge_gap_ms", prepare.ClipMergeMS),
)

小结

  • 日志 = zap core(级别 + encoder + lumberjack writer),默认 JSON + 文件轮转。
  • 全仓库结构化字段命名统一(job_id / step / removed...),按 job_id 可重放任务轨迹。
  • nil 换 Nop 的防御式约定让「不关心日志」成为合法选择。

思考题

  1. 容器化最佳实践要求日志走 stdout,本章方案的迁移成本与保留理由如何权衡?
  2. 若要为每次 LLM 调用记录 token 消耗,应在哪个层(llm 包 or service 层)加字段,为什么?

项目信息

  • GitHub仓库:github.com/Chyona/live-mixer
  • 项目案例:gogoshine.com
相关文章
|
2月前
|
人工智能 关系型数据库 语音技术
【直播切片工作台】第2章:技术选型与分层架构设计
本章详解Live-Mixer项目技术选型与分层架构:基于IO密集、长耗时AI任务约束,选用Go+Gin+GORM+PostgreSQL(JSONB)+zap+原生HTTP客户端;严格遵循handler→service→repository→model分层,能力下沉至internal/pkg,践行“适度设计”与运维极简主义。(239字)
|
4月前
|
JSON 自然语言处理 前端开发
【开源剪映小助手】项目概述
capcut-mate 是一款开源免费、支持独立部署的剪映自动化系统,基于 FastAPI 构建,深度融合大模型能力,提供草稿创建、素材编排、云端渲染、本地导出及智能编辑等全链路功能,助力内容创作者高效批量生产专业视频。(239字)
|
4月前
|
JSON 缓存 人工智能
【剪映小助手】媒体处理接口
CapCut Mate 是基于 FastAPI 的剪映自动化媒体处理接口,支持视频、音频、图片、贴纸的批量添加与轨道管理,提供草稿创建/保存/获取及标准化错误处理,助力高效、可控的AI视频编辑流程。(239字)
|
4月前
|
前端开发 中间件 API
【开源剪映小助手】技术栈概览
CapCut Mate(剪映小助手)是一款视频草稿自动化处理工具,基于Python(FastAPI+uiautomation)后端与Electron+React桌面客户端,实现草稿下载、素材管理、智能生成及一键导出。支持容器化部署,架构清晰、扩展性强。(239字)
|
6月前
|
监控 前端开发 中间件
【开源剪映小助手】调试与故障排除
本指南面向capcut-mate开发者,系统梳理Python后端(FastAPI)、Electron桌面端与React前端的调试方法,涵盖日志分析、IPC通信、异常处理、性能优化及常见故障排查,助力高效定位与解决运行时问题。(239字)
320 10
|
6月前
|
编解码 缓存 API
【开源剪映小助手】草稿管理接口
本文档详解剪映草稿管理三大核心API:创建、保存及获取草稿文件列表,涵盖请求参数、响应格式、错误码、URL规则与最佳实践,助力开发者快速集成稳定高效的草稿系统。(239字)
|
6月前
|
Linux 测试技术 开发者
【开源剪映小助手】开发者指南
capcut-mate 是开源剪映自动化工具,基于 FastAPI + Electron 构建,支持跨平台草稿管理、媒体处理与视频导出。采用分层架构、条件依赖与优雅降级机制,确保 Windows/Linux 兼容性与一致开发体验。(239字)
|
4月前
|
缓存 监控 Java
【剪映小助手】视频处理接口
视频处理接口是CapCut Mate核心模块,支持批量添加视频并提供时间范围、透明度、缩放、遮罩、转场、音量等高级编辑功能;新增场景时间线智能变速能力,自动计算播放速度,实现精准时间同步与节奏控制。(239字)
|
6月前
|
存储 缓存 前端开发
【开源剪映小助手】代码结构说明
本项目为CapCut Mate(剪映助手)后端与桌面客户端一体化方案,采用“FastAPI(Python)+ Electron+React”混合架构。后端分层清晰(Router→Service→Utils),前端通过预加载脚本与IPC安全调用原生能力,支持草稿管理、媒体处理与视频导出,兼顾性能、可维护性与跨平台兼容性。(239字)
|
6月前
|
缓存 监控 API
【开源剪映小助手】媒体处理功能
CapCut Mate是基于剪映的专业视频编辑辅助工具,提供视频、音频、图片、字幕的智能添加、处理与时间线管理。采用FastAPI架构,集成UI自动化控制、多级缓存及异步任务调度,支持微秒级精度编排与完善错误恢复,兼顾高性能与高可用性。(239字)

热门文章

最新文章