Compare commits

...

4 Commits

Author SHA1 Message Date
q792602257 1dde8fb172 日志 2026-07-02 20:19:33 +08:00
q792602257 5be16406e4 Merge remote-tracking branch 'origin/master' 2026-07-02 20:19:08 +08:00
sl b3cd5f4809 chore: 更新 gitignore 忽略 Go 缓存目录
- 添加 .gocache
- 添加 .gomodcache
2026-07-01 10:27:52 +08:00
sl 763e0d0382 feat:添加区域入侵上报 2026-07-01 10:26:50 +08:00
7 changed files with 57 additions and 6 deletions
+3 -1
View File
@@ -1,4 +1,6 @@
dist/ dist/
.idea/ .idea/
.exe .exe
.claude .claude
.gocache
.gomodcache
+7 -1
View File
@@ -31,6 +31,7 @@ func SyncTask() ([]dto.Task, error) {
logger.Error("序列化JSON失败", zap.Error(err)) logger.Error("序列化JSON失败", zap.Error(err))
return nil, err return nil, err
} }
logger.Debug("发起任务同步请求", zap.String("url", url), zap.String("requestBody", string(jsonData)))
req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData)) req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
if err != nil { if err != nil {
logger.Error("创建请求失败", zap.Error(err)) logger.Error("创建请求失败", zap.Error(err))
@@ -48,6 +49,9 @@ func SyncTask() ([]dto.Task, error) {
logger.Error("读取响应体失败", zap.Error(err)) logger.Error("读取响应体失败", zap.Error(err))
return nil, err return nil, err
} }
logger.Debug("任务同步响应",
zap.Int("httpStatusCode", resp.StatusCode),
zap.String("responseBody", string(body)))
// 解析响应体为 map // 解析响应体为 map
var response dto.TaskListResponse var response dto.TaskListResponse
@@ -59,7 +63,9 @@ func SyncTask() ([]dto.Task, error) {
return nil, err return nil, err
} }
if response.Code != 200 { 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 nil, fmt.Errorf(response.Msg)
} }
return response.Data, nil return response.Data, nil
+8
View File
@@ -60,6 +60,10 @@ func RegisterVIIDRoutes(r *gin.Engine) {
sys.POST("/UnRegister", HandleUnRegister) sys.POST("/UnRegister", HandleUnRegister)
sys.GET("/Time", HandleSystemTime) sys.GET("/Time", HandleSystemTime)
} }
extend := viid.Group("/Extend")
{
extend.POST("/SceneCapture", HandleSceneCapture)
}
viid.POST("/Faces", HandleUploadFaces) viid.POST("/Faces", HandleUploadFaces)
} }
} }
@@ -78,6 +82,10 @@ func HandleUnRegister(c *gin.Context) {
proxyHelper(c, "/VIID/System/UnRegister") proxyHelper(c, "/VIID/System/UnRegister")
} }
func HandleSceneCapture(c *gin.Context) {
proxyHelper(c, "/VIID/Extend/SceneCapture")
}
func proxyHelper(c *gin.Context, path string) { func proxyHelper(c *gin.Context, path string) {
resp, err := ProxyRequest(c.Request.Context(), c.Request.Method, path, c.Request.Body, c.Request.Header) resp, err := ProxyRequest(c.Request.Context(), c.Request.Method, path, c.Request.Body, c.Request.Header)
if err != nil { if err != nil {
+2
View File
@@ -39,3 +39,5 @@ preview:
resolutions: resolutions:
- 720 - 720
- 1080 - 1080
log:
level: "info" # debug/info/warn/error,排查问题时可临时改为 debug
+6
View File
@@ -70,6 +70,11 @@ type PreviewConfig struct {
HwAccel string `mapstructure:"hwaccel"` HwAccel string `mapstructure:"hwaccel"`
} }
type LogConfig struct {
// Level 日志级别:debug/info/warn/error,默认 info。排查问题时可临时改为 debug。
Level string `mapstructure:"level"`
}
type MainConfig struct { type MainConfig struct {
Api ApiConfig `mapstructure:"api"` Api ApiConfig `mapstructure:"api"`
Record RecordConfig `mapstructure:"record"` Record RecordConfig `mapstructure:"record"`
@@ -79,4 +84,5 @@ type MainConfig struct {
DisconnectAction DisconnectActionConfig `mapstructure:"disconnectAction"` DisconnectAction DisconnectActionConfig `mapstructure:"disconnectAction"`
Preview PreviewConfig `mapstructure:"preview"` Preview PreviewConfig `mapstructure:"preview"`
AddSilentAudio bool `mapstructure:"addSilentAudio"` AddSilentAudio bool `mapstructure:"addSilentAudio"`
Log LogConfig `mapstructure:"log"`
} }
+18 -4
View File
@@ -8,6 +8,9 @@ import (
var Logger *zap.Logger var Logger *zap.Logger
// atomicLevel 持有当前生效的日志级别,支持在配置加载完成后动态调整(无需重建 Logger)
var atomicLevel = zap.NewAtomicLevelAt(zap.InfoLevel)
func Init() error { func Init() error {
config := zap.NewProductionConfig() config := zap.NewProductionConfig()
config.OutputPaths = []string{"stdout"} config.OutputPaths = []string{"stdout"}
@@ -25,9 +28,6 @@ func Init() error {
// 创建写入器 // 创建写入器
w := zapcore.AddSync(lumberJackLogger) w := zapcore.AddSync(lumberJackLogger)
// 设置日志级别
level := zap.NewAtomicLevelAt(zap.InfoLevel)
// 创建编码器配置 // 创建编码器配置
encoderConfig := zap.NewProductionEncoderConfig() encoderConfig := zap.NewProductionEncoderConfig()
encoderConfig.TimeKey = "time" encoderConfig.TimeKey = "time"
@@ -41,7 +41,7 @@ func Init() error {
encoder := zapcore.NewConsoleEncoder(encoderConfig) 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)) Logger = zap.New(core, zap.AddCaller(), zap.AddStacktrace(zapcore.ErrorLevel))
@@ -49,6 +49,20 @@ func Init() error {
return nil 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) { func Info(message string, fields ...zap.Field) {
Logger.Info(message, fields...) Logger.Info(message, fields...)
} }
+13
View File
@@ -192,6 +192,7 @@ func runTaskLoop(ctx context.Context) {
return return
case <-ticker.C: case <-ticker.C:
// 执行任务 // 执行任务
logger.Debug("开始同步任务", zap.Int("deviceCount", len(config.Config.Devices)))
tasks, err := api.SyncTask() tasks, err := api.SyncTask()
if err != nil { if err != nil {
var connErr *api.ConnError var connErr *api.ConnError
@@ -230,6 +231,7 @@ func runTaskLoop(ctx context.Context) {
firstFailureTime = time.Time{} firstFailureTime = time.Time{}
commandExecuted = false commandExecuted = false
} }
logger.Debug("同步任务完成", zap.Int("taskCount", len(tasks)))
for _, task := range tasks { for _, task := range tasks {
logger.Info("开始处理任务", logger.Info("开始处理任务",
zap.String("taskID", task.TaskID), 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("startTime", task.StartTime.Format("2006-01-02 15:04:05")),
zap.String("endTime", task.EndTime.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 { for _, device := range config.Config.Devices {
if device.DeviceNo == task.DeviceNo { if device.DeviceNo == task.DeviceNo {
matched = true
// 处理任务 // 处理任务
go startTask(device, task) go startTask(device, task)
break // 提前返回,避免不必要的循环 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)) logger.Fatal("加载配置文件失败", zap.Error(err))
return 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() ctx := context.Background()
shutdown, err := telemetry.InitTelemetry(ctx) shutdown, err := telemetry.InitTelemetry(ctx)
if err != nil { if err != nil {