重构日志与可观测性体系
新增单行文本编码器与结构化 GORM 日志,统一错误记录与请求日志策略,收紧日志文件权限并修复按天切分与压缩,支付回调参数脱敏,生产强制阿里云短信,RequestID 校验防注入,日志文案中文化。
This commit is contained in:
+12
-12
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user