补齐相关日志日志
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user