package config import ( "context" "github.com/fsnotify/fsnotify" "github.com/spf13/viper" "go.uber.org/zap" ) // Watch 监听配置文件变化 // 运行直到上下文被取消 func Watch(ctx context.Context, logger *zap.Logger) { viper.WatchConfig() viper.OnConfigChange(func(e fsnotify.Event) { select { case <-ctx.Done(): return // 如果上下文被取消则停止处理 default: logger.Info("配置文件已更改", zap.String("file", e.Name)) // 尝试重新加载 newConfig, err := Reload() if err != nil { logger.Error("重新加载配置失败,保留先前配置", zap.Error(err), zap.String("file", e.Name), ) return } logger.Info("配置重新加载成功", zap.String("file", e.Name), zap.String("server_address", newConfig.Server.Address), zap.String("log_level", newConfig.Logging.Level), ) } }) // 阻塞直到上下文被取消 <-ctx.Done() logger.Info("配置监听器已停止") }