From a5a925f789eef8db494e15a5443cb587c4281074 Mon Sep 17 00:00:00 2001 From: Max Date: Thu, 15 Jan 2026 16:20:08 +0800 Subject: [PATCH] Enhance Log Retrieval Functionality in Job Logs - Added error handling for missing 'data' field in the ListLogs result, improving robustness. - Implemented handling for nil data, returning an empty log slice as needed. - Expanded data type handling to include generic []interface{}, ensuring compatibility with various log formats. - Enhanced logging structure by extracting message, level, and job_id fields from different data types, improving log consistency and usability. --- agent/robot/job/log_test.go | 49 ++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/agent/robot/job/log_test.go b/agent/robot/job/log_test.go index bc5825d2..1aa11138 100644 --- a/agent/robot/job/log_test.go +++ b/agent/robot/job/log_test.go @@ -3,6 +3,7 @@ package job_test import ( "context" "errors" + "fmt" "testing" "github.com/stretchr/testify/assert" @@ -675,12 +676,22 @@ func getJobLogs(jobID string) ([]*yaojob.Log, error) { return nil, err } + data, exists := result["data"] + if !exists { + return nil, fmt.Errorf("ListLogs result missing 'data' field") + } + + // Handle nil data + if data == nil { + return []*yaojob.Log{}, nil + } + // Handle different data types from ListLogs var logs []*yaojob.Log - switch data := result["data"].(type) { + switch typedData := data.(type) { case []maps.MapStrAny: - for _, item := range data { + for _, item := range typedData { log := &yaojob.Log{} if msg, ok := item["message"].(string); ok { log.Message = msg @@ -694,7 +705,7 @@ func getJobLogs(jobID string) ([]*yaojob.Log, error) { logs = append(logs, log) } case []map[string]interface{}: - for _, item := range data { + for _, item := range typedData { log := &yaojob.Log{} if msg, ok := item["message"].(string); ok { log.Message = msg @@ -707,6 +718,38 @@ func getJobLogs(jobID string) ([]*yaojob.Log, error) { } logs = append(logs, log) } + case []interface{}: + // Handle generic []interface{} which may contain map types + for _, rawItem := range typedData { + log := &yaojob.Log{} + switch item := rawItem.(type) { + case maps.MapStrAny: + if msg, ok := item["message"].(string); ok { + log.Message = msg + } + if level, ok := item["level"].(string); ok { + log.Level = level + } + if jid, ok := item["job_id"].(string); ok { + log.JobID = jid + } + case map[string]interface{}: + if msg, ok := item["message"].(string); ok { + log.Message = msg + } + if level, ok := item["level"].(string); ok { + log.Level = level + } + if jid, ok := item["job_id"].(string); ok { + log.JobID = jid + } + default: + return nil, fmt.Errorf("unexpected item type in data array: %T", rawItem) + } + logs = append(logs, log) + } + default: + return nil, fmt.Errorf("unexpected data type from ListLogs: %T (value: %v)", data, data) } return logs, nil