44 lines
984 B
Go
44 lines
984 B
Go
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("配置监听器已停止")
|
|
}
|