diff --git a/api/sync_task.go b/api/sync_task.go index a122155..d5de6d4 100644 --- a/api/sync_task.go +++ b/api/sync_task.go @@ -31,6 +31,7 @@ func SyncTask() ([]dto.Task, error) { logger.Error("序列化JSON失败", zap.Error(err)) return nil, err } + logger.Debug("发起任务同步请求", zap.String("url", url), zap.String("requestBody", string(jsonData))) req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData)) if err != nil { logger.Error("创建请求失败", zap.Error(err)) @@ -48,6 +49,9 @@ func SyncTask() ([]dto.Task, error) { logger.Error("读取响应体失败", zap.Error(err)) return nil, err } + logger.Debug("任务同步响应", + zap.Int("httpStatusCode", resp.StatusCode), + zap.String("responseBody", string(body))) // 解析响应体为 map var response dto.TaskListResponse @@ -59,7 +63,9 @@ func SyncTask() ([]dto.Task, error) { return nil, err } if response.Code != 200 { - logger.Error("响应错误码", zap.Int("code", response.Code)) + logger.Error("响应错误码", + zap.Int("code", response.Code), + zap.String("msg", response.Msg)) return nil, fmt.Errorf(response.Msg) } return response.Data, nil diff --git a/config.yaml b/config.yaml index fe2da71..a2bb631 100644 --- a/config.yaml +++ b/config.yaml @@ -39,3 +39,5 @@ preview: resolutions: - 720 - 1080 +log: + level: "info" # debug/info/warn/error,排查问题时可临时改为 debug diff --git a/config/dto.go b/config/dto.go index 7942e1b..473db85 100644 --- a/config/dto.go +++ b/config/dto.go @@ -70,6 +70,11 @@ type PreviewConfig struct { HwAccel string `mapstructure:"hwaccel"` } +type LogConfig struct { + // Level 日志级别:debug/info/warn/error,默认 info。排查问题时可临时改为 debug。 + Level string `mapstructure:"level"` +} + type MainConfig struct { Api ApiConfig `mapstructure:"api"` Record RecordConfig `mapstructure:"record"` @@ -79,4 +84,5 @@ type MainConfig struct { DisconnectAction DisconnectActionConfig `mapstructure:"disconnectAction"` Preview PreviewConfig `mapstructure:"preview"` AddSilentAudio bool `mapstructure:"addSilentAudio"` + Log LogConfig `mapstructure:"log"` } diff --git a/logger/logger.go b/logger/logger.go index 968d723..efe39e1 100644 --- a/logger/logger.go +++ b/logger/logger.go @@ -8,6 +8,9 @@ import ( var Logger *zap.Logger +// atomicLevel 持有当前生效的日志级别,支持在配置加载完成后动态调整(无需重建 Logger) +var atomicLevel = zap.NewAtomicLevelAt(zap.InfoLevel) + func Init() error { config := zap.NewProductionConfig() config.OutputPaths = []string{"stdout"} @@ -25,9 +28,6 @@ func Init() error { // 创建写入器 w := zapcore.AddSync(lumberJackLogger) - // 设置日志级别 - level := zap.NewAtomicLevelAt(zap.InfoLevel) - // 创建编码器配置 encoderConfig := zap.NewProductionEncoderConfig() encoderConfig.TimeKey = "time" @@ -41,7 +41,7 @@ func Init() error { encoder := zapcore.NewConsoleEncoder(encoderConfig) // 创建核心 - core := zapcore.NewCore(encoder, w, level) + core := zapcore.NewCore(encoder, w, atomicLevel) // 创建日志记录器 Logger = zap.New(core, zap.AddCaller(), zap.AddStacktrace(zapcore.ErrorLevel)) @@ -49,6 +49,20 @@ func Init() error { return nil } +// SetLevel 动态调整日志级别,可在配置文件加载完成后调用(例如开启 debug 日志排查问题)。 +// levelStr 支持 debug/info/warn/error 等,为空或非法值时保持当前级别不变并返回错误。 +func SetLevel(levelStr string) error { + if levelStr == "" { + return nil + } + var level zapcore.Level + if err := level.UnmarshalText([]byte(levelStr)); err != nil { + return err + } + atomicLevel.SetLevel(level) + return nil +} + func Info(message string, fields ...zap.Field) { Logger.Info(message, fields...) } diff --git a/main.go b/main.go index 24dc128..d299e1f 100644 --- a/main.go +++ b/main.go @@ -192,6 +192,7 @@ func runTaskLoop(ctx context.Context) { return case <-ticker.C: // 执行任务 + logger.Debug("开始同步任务", zap.Int("deviceCount", len(config.Config.Devices))) tasks, err := api.SyncTask() if err != nil { var connErr *api.ConnError @@ -230,6 +231,7 @@ func runTaskLoop(ctx context.Context) { firstFailureTime = time.Time{} commandExecuted = false } + logger.Debug("同步任务完成", zap.Int("taskCount", len(tasks))) for _, task := range tasks { logger.Info("开始处理任务", zap.String("taskID", task.TaskID), @@ -237,13 +239,20 @@ func runTaskLoop(ctx context.Context) { zap.String("startTime", task.StartTime.Format("2006-01-02 15:04:05")), zap.String("endTime", task.EndTime.Format("2006-01-02 15:04:05"))) // 处理任务 + matched := false for _, device := range config.Config.Devices { if device.DeviceNo == task.DeviceNo { + matched = true // 处理任务 go startTask(device, task) break // 提前返回,避免不必要的循环 } } + if !matched { + logger.Warn("任务的设备编号未匹配到任何已配置设备,任务被跳过", + zap.String("taskID", task.TaskID), + zap.String("deviceNo", task.DeviceNo)) + } } } } @@ -283,6 +292,10 @@ func main() { logger.Fatal("加载配置文件失败", zap.Error(err)) return } + if err := logger.SetLevel(config.Config.Log.Level); err != nil { + logger.Warn("日志级别配置无效,使用默认级别", + zap.String("level", config.Config.Log.Level), zap.Error(err)) + } ctx := context.Background() shutdown, err := telemetry.InitTelemetry(ctx) if err != nil {