重构日志与可观测性体系

新增单行文本编码器与结构化 GORM 日志,统一错误记录与请求日志策略,收紧日志文件权限并修复按天切分与压缩,支付回调参数脱敏,生产强制阿里云短信,RequestID 校验防注入,日志文案中文化。
This commit is contained in:
yml2213
2026-07-29 16:19:35 +08:00
parent e75f1a8519
commit 88d74aca7d
64 changed files with 896 additions and 277 deletions
+12 -12
View File
@@ -53,14 +53,14 @@ func main() {
_ = logger.Sync()
}()
if err := cfg.ValidateProductionSecurity(); err != nil {
logger.Fatal("production security config invalid", zap.Error(err))
logger.Fatal("生产安全配置校验失败", zap.Error(err))
}
logAuthRuntimeIdentity(logger, cfg)
var deps router.Dependencies
db, err := database.OpenMySQL(cfg.MySQLDSN, cfg.Log.Level)
db, err := database.OpenMySQL(cfg.MySQLDSN, cfg.Log.Level, logger)
if err != nil {
logger.Warn("mysql unavailable; database-backed APIs will return 503", zap.Error(err))
logger.Warn("MySQL 不可用,数据库接口将返回 503", zap.Error(err))
} else {
deps.DB = db
if err := adminauth.BootstrapAdmin(context.Background(), db, adminauth.BootstrapConfig{
@@ -69,7 +69,7 @@ func main() {
Password: cfg.BootstrapAdminPassword,
Nickname: cfg.BootstrapAdminNickname,
}); err != nil {
logger.Fatal("admin bootstrap failed", zap.Error(err))
logger.Fatal("初始管理员创建失败", zap.Error(err))
}
}
redisClient, err := database.OpenRedis(context.Background(), database.RedisConfig{
@@ -78,7 +78,7 @@ func main() {
DB: cfg.RedisDB,
})
if err != nil {
logger.Warn("redis unavailable; redis-backed APIs will return 503", zap.Error(err))
logger.Warn("Redis 不可用,相关接口将返回 503", zap.Error(err))
} else {
deps.Redis = redisClient
defer func() {
@@ -103,9 +103,9 @@ func main() {
}
go func() {
logger.Info("api server starting", zap.String("addr", cfg.AppAddr))
logger.Info("API 服务启动", zap.String("addr", cfg.AppAddr))
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
logger.Fatal("api server failed", zap.Error(err))
logger.Fatal("API 服务异常退出", zap.Error(err))
}
}()
@@ -117,9 +117,9 @@ func main() {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
if err := server.Shutdown(ctx); err != nil {
logger.Fatal("api server shutdown failed", zap.Error(err))
logger.Fatal("API 服务关闭失败", zap.Error(err))
}
logger.Info("api server stopped")
logger.Info("API 服务已停止")
}
// logAuthRuntimeIdentity 记录可用于排查多实例或部署配置漂移的非敏感身份信息。
@@ -129,7 +129,7 @@ func logAuthRuntimeIdentity(logger *zap.Logger, cfg config.Config) {
instanceID = "unknown"
}
sum := sha256.Sum256([]byte(cfg.JWTSecret))
logger.Info("auth runtime identity",
logger.Debug("认证运行实例",
zap.String("instance_id", instanceID),
zap.String("app_env", cfg.AppEnv),
zap.String("jwt_secret_fingerprint", hex.EncodeToString(sum[:])[:12]),
@@ -146,10 +146,10 @@ func newPaymentConfigRepositoryForJobs(cfg config.Config, db *gorm.DB, logger *z
}
if encryptor == nil {
if config.IsProductionEnv(cfg.AppEnv) {
logger.Fatal("PAYMENT_CONFIG_ENCRYPTION_KEY not set or invalid")
logger.Fatal("支付配置加密密钥未设置或无效")
}
encryptor = &paymentconfig.MockEncryptor{}
logger.Warn("PAYMENT_CONFIG_ENCRYPTION_KEY not set or invalid, using MockEncryptor for jobs")
logger.Debug("定时任务使用模拟支付配置加密器")
}
return paymentconfig.NewRepository(db, encryptor)
}