package config import ( "os" "time" klog "github.com/sirupsen/logrus" "github.com/spf13/viper" ) // startConfigFileWatcher 启动配置文件轮询监听 func startConfigFileWatcher(configFile string, v *viper.Viper) { if configFile == "" { klog.Warnf("⚠️ [CONFIG] ConfigFileUsed() returned empty string, cannot start polling watcher") return } klog.Infof("✓ [CONFIG] Starting polling watcher for: %s", configFile) go func() { lastModTime := time.Now() // 初始化时获取文件的修改时间 if info, err := os.Stat(configFile); err == nil { lastModTime = info.ModTime() klog.Infof("✓ [CONFIG] Initial file modTime: %v", lastModTime) } ticker := time.NewTicker(1 * time.Second) defer ticker.Stop() for { select { case <-ticker.C: info, err := os.Stat(configFile) if err != nil { // 文件不存在或无法访问,跳过本次检查 klog.Debugf("⏭️ [CONFIG] Cannot stat config file: %v", err) continue } // 检查文件修改时间是否变化 if info.ModTime().After(lastModTime) { lastModTime = info.ModTime() klog.Infof("🔔 [CONFIG] Config file changed detected by polling: %s (modTime: %v)", configFile, lastModTime) configMutex.Lock() // 重新加载配置 if err := v.ReadInConfig(); err != nil { klog.Errorf("❌ [CONFIG] Error reloading config file: %v", err) configMutex.Unlock() continue } // 重新加载 Config 管理器 cfg := Get() cfg.Reload() // 应用配置变更 applyConfig(v, true) configMutex.Unlock() } } } }() } // watchCommonIni 使用轮询方式监控 common.ini 文件变化 // 注意:RunInOmniagent 是启动时确定的标志,不支持热更新 // 只有在启动时 RunInOmniagent 为 true 时,才会启动此监控 func watchCommonIni(iniPath string) { klog.Infof("✓ [CONFIG] Starting polling watcher for common.ini: %s", iniPath) go func() { lastModTime := time.Now() // 初始化时获取文件的修改时间 if info, err := os.Stat(iniPath); err == nil { lastModTime = info.ModTime() klog.Infof("✓ [CONFIG] Initial common.ini modTime: %v", lastModTime) } ticker := time.NewTicker(1 * time.Second) defer ticker.Stop() for { select { case <-ticker.C: info, err := os.Stat(iniPath) if err != nil { // 文件不存在或无法访问,跳过本次检查 klog.Debugf("⏭️ [CONFIG] Cannot stat common.ini file: %v", err) continue } // 检查文件修改时间是否变化 if info.ModTime().After(lastModTime) { lastModTime = info.ModTime() klog.Infof("🔔 [CONFIG] common.ini file changed detected by polling: %s (modTime: %v)", iniPath, lastModTime) configMutex.Lock() loadConfigFromCommonIni() configMutex.Unlock() } } } }() }