Codex项目需在main.go中配置http.Server.ErrorLog绑定自定义日志器,为Handler添加defer+recover兜底,业务错误须链式包装并结构化记录,日志输出需正确配置lumberjack轮转与JSON编码。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

在Codex项目中处理后端异常并确保错误被可靠记录到日志系统,是保障服务可观测性和故障快速定位的关键操作。
捕获未处理的全局异常
在应用启动入口(如 main.go)中,用 http.Server 的 ErrorLog 字段绑定自定义日志器,覆盖默认的 panic 打印行为。
调用 http.ListenAndServe 前,设置 server.ErrorLog = log.New(customWriter, "[HTTP ERROR] ", log.LstdFlags),否则 500 错误堆栈只会输出到终端且无法归档。
为每个 HTTP Handler 添加中间件式错误兜底
方法一:使用 defer + recover 封装 handler
在路由注册前,将原始 handler 包裹进一个闭包函数:func(h http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { defer func() { if err := recover(); err != nil { logger.Error("panic recovered", "path", r.URL.Path, "err", err) } }(); h.ServeHTTP(w, r) }) }。
方法二:直接在 handler 内部写 defer
每个业务 handler 函数开头插入 defer func() { if r := recover(); r != nil { logger.Error("handler panic", "handler", "UserCreate", "recover", r) } }(),这比全局中间件更精准,但需人工补全,漏写就会丢失上下文。
通过 Codex CLI 生成图片,支持尺寸控制和批量模式。依赖:codex (npm)。代理默认启用。用 generate.sh 生成单张,batch_generate.sh 批量生成游戏 UI 素材,gen_size.sh 指定尺寸。所有输出保存至 ~/.codex/generated_images/。
结构化记录业务层异常
第一步:所有 error 类型必须实现 error 接口且携带上下文字段。
第二步:用 fmt.Errorf("failed to query user: %w", err) 链式包装底层错误,避免丢失原始堆栈;若直接用 errors.New 或字符串拼接,errors.Is 和 errors.As 将失效,后续分类告警无法匹配。
第三步:在关键分支调用 logger.Error("db insert failed", "user_id", userID, "err", err),其中 err 必须传入原生 error 变量,不能转成字符串——否则 zap/lumberjack 等结构化日志器无法提取堆栈帧。
注意:不要在日志语句里对 error 调用 .Error() 方法再传入,这会抹掉结构化能力。
配置日志输出目标与轮转策略
初始化 logger 时指定文件写入器:lumberjack.Logger{Filename: "/var/log/codex/app.log", MaxSize: 100, MaxBackups: 7, MaxAge: 28}。
【MaxSize 单位是 MB,不是 KB】 若填错成 100,实际是 100MB,可能撑爆磁盘。
启用 JSON 格式输出:zap.NewProductionEncoderConfig() 并设置 TimeKey、LevelKey 等字段名与公司日志平台字段对齐,否则 ELK 或 Loki 无法解析时间戳和等级。














