补齐相关日志日志

This commit is contained in:
2026-09-16 00:23:49 +08:00
parent 8c2ea84939
commit b2e5eef3c8
39 changed files with 1576 additions and 176 deletions
+36 -13
View File
@@ -9,6 +9,7 @@ import (
"net/http"
"os"
"os/signal"
"strings"
"syscall"
"time"
@@ -70,6 +71,9 @@ func main() {
// 清理超期未保存的 AI 推荐穿搭(status=3),避免长期堆积。
service.StartAIOutfitCleanupScheduler()
// 为已过期的固定有效期额度凭证补记「到期失效」流水,让额度明细闭环。
service.StartQuotaExpireScheduler()
router := routers.NewRouter()
s := &http.Server{
@@ -220,6 +224,12 @@ func setupSetting() error {
return err
}
// 新用户注册赠送的体验会员及其额度(与上面的免费额度相互独立、叠加生效)。
err = setting.ReadSection("NewUserGift", &global.NewUserGiftSetting)
if err != nil {
return err
}
err = setting.ReadSection("AdReward", &global.AdRewardSetting)
if err != nil {
return err
@@ -250,36 +260,49 @@ func setupSlogLogger() error {
MaxBackups: global.LogSetting.MaxBackups,
MaxAge: global.LogSetting.MaxAge,
Compress: true,
LocalTime: true, // 轮转文件名时间戳使用本地时区(默认 UTC,与业务展示时区不一致)
}
multiWriter := io.MultiWriter(writer, os.Stdout)
// 级别匹配忽略大小写与首尾空白,避免 "debug"/"Info " 等误配静默回落 Info。
level := slog.LevelInfo
switch global.LogSetting.LogLevel {
case "Debug":
unknownLevel := ""
switch strings.ToLower(strings.TrimSpace(global.LogSetting.LogLevel)) {
case "debug":
level = slog.LevelDebug
case "Warn":
case "", "info":
level = slog.LevelInfo
case "warn", "warning":
level = slog.LevelWarn
case "Error":
case "error":
level = slog.LevelError
default:
level = slog.LevelInfo
unknownLevel = global.LogSetting.LogLevel
}
// 本地 JSON 日志(文件 + stdout),并注入 trace_id/span_id。
localHandler := tracing.OtelContextHandler{
Handler: slog.NewJSONHandler(multiWriter, &slog.HandlerOptions{
AddSource: true,
Level: level,
}),
}
// 本地 JSON 日志(文件 + stdout)。
// AddSource 保留全量开启:按级别裁剪需自定义 Handler(slog.HandlerOptions 不支持),
// 复杂度与收益不成比例;后续如需降本可在此处自定义 Handler 实现。
localHandler := slog.NewJSONHandler(multiWriter, &slog.HandlerOptions{
AddSource: true,
Level: level,
})
// OTel 日志桥接:将 slog 记录导出到 OTel Logs(LoggerProvider 已在 setupOTel 就绪;
// 未启用 OTel 时为 no-op,不产生开销)。
otelHandler := otelslog.NewHandler("zt-closet-backend")
// 扇出:本地日志 + OTel 日志同时输出。
slog.SetDefault(slog.New(tracing.NewFanoutHandler(localHandler, otelHandler)))
// trace_id/span_id 注入放在扇出外层:FanoutHandler 对子 handler 使用 record 副本分发(r.Clone()),
// 在外层 AddAttrs 后两个分支都能拿到,本地输出等价、OTel 桥接分支也能携带链路标识。
slog.SetDefault(slog.New(tracing.OtelContextHandler{
Handler: tracing.NewFanoutHandler(localHandler, otelHandler),
}))
if unknownLevel != "" {
slog.Warn("unknown log level in config, fallback to info", "configured", unknownLevel)
}
return nil
}