@@ -25,6 +25,7 @@ import (
2525var workerEntrypointsFS embed.FS
2626
2727const logAndOutputSeparator = "\n **=====^=====**\n "
28+ const workerLogSeparatorLine = "==============="
2829const (
2930 defaultPythonCgroupMemMaxBytes = 64 * 1024 * 1024
3031 defaultNodeCgroupMemMaxBytes = 64 * 1024 * 1024
@@ -45,6 +46,7 @@ type ExecuteResult struct {
4546 Body any
4647 Stdout string
4748 Stderr string
49+ ExecLog string
4850 Result string
4951 DurationMS int64
5052 TimedOut bool
@@ -87,6 +89,7 @@ func Run(parent context.Context, workerSpec worker.WorkerSpec, cfg config.Config
8789 ServerPort : cfg .MagicServerPort ,
8890 Payload : payload ,
8991 })
92+ result .ExecLog = bridgeStdout
9093 result .Stderr = bridgeStderr
9194
9295 if errors .Is (parent .Err (), context .DeadlineExceeded ) {
@@ -97,18 +100,19 @@ func Run(parent context.Context, workerSpec worker.WorkerSpec, cfg config.Config
97100 }
98101 if runErr != nil {
99102 // slog.Error("脚本执行失败", "worker_id", worker.ID, "request_id", input.Event.RequestID, "stderr", bridgeStderr, "err", runErr)
100- result .Stdout = bridgeStdout
103+ result .Stdout = extractWorkerStdout ( result . ExecLog )
101104 result .Err = buildScriptExecuteError (bridgeStderr , runErr )
102105 return
103106 }
104107
105108 logOutput , resultOutput , err := splitBridgeOutput (bridgeStdout )
106109 if err != nil {
107- result .Stdout = bridgeStdout
110+ result .Stdout = extractWorkerStdout ( result . ExecLog )
108111 result .Err = fmt .Errorf ("脚本 stdout 格式错误: %w" , err )
109112 return
110113 }
111- result .Stdout = logOutput
114+ _ = logOutput
115+ result .Stdout = extractWorkerStdout (result .ExecLog )
112116 result .Result = resultOutput
113117
114118 scriptOut , err := parseScriptOutput ([]byte (resultOutput ))
@@ -654,6 +658,37 @@ func splitBridgeOutput(stdout string) (logOutput string, resultOutput string, er
654658 return logOutput , resultOutput , nil
655659}
656660
661+ func extractWorkerStdout (execLog string ) string {
662+ if strings .TrimSpace (execLog ) == "" {
663+ return ""
664+ }
665+
666+ logSource := execLog
667+ if logOutput , _ , err := splitBridgeOutput (execLog ); err == nil {
668+ logSource = logOutput
669+ }
670+
671+ lines := strings .Split (logSource , "\n " )
672+ startIdx := - 1
673+ endIdx := - 1
674+ for index , line := range lines {
675+ if strings .TrimSpace (line ) != workerLogSeparatorLine {
676+ continue
677+ }
678+ if startIdx < 0 {
679+ startIdx = index
680+ continue
681+ }
682+ endIdx = index
683+ }
684+
685+ if startIdx >= 0 && endIdx > startIdx {
686+ return strings .Trim (strings .Join (lines [startIdx + 1 :endIdx ], "\n " ), "\n " )
687+ }
688+
689+ return strings .TrimSpace (logSource )
690+ }
691+
657692// 用于在 Python 虚拟环境目录下定位真实的 site-packages 路径,供构建 PYTHONPATH 使用。
658693func detectPythonSitePackages (pythonEnvDir string ) string {
659694 libDir := filepath .Join (pythonEnvDir , "lib" )
0 commit comments