go语言中使用exec.Command时,发生错误是这样的格式,exit status + 数字,造成无法查看异常日志。
现在可使用stderr和Stdout构建一个日志输出。
比如:运行 go run main.go ,可以进行如下操作:
1.在main.go同目录下,创建main_debug.go文件
2.main_debug.go文件中写入如下代码
package main
import (
"bytes"
"fmt"
"log"
"os/exec"
)
func main() {
// 定义要运行的命令
cmd := exec.Command("go", "run", "main.go")
// 定义缓冲区来捕获标准输出和标准错误
var out bytes.Buffer
var stderr bytes.Buffer
cmd.Stdout = &out
cmd.Stderr = &stderr
// 运行命令
err := cmd.Run()
if err != nil {
log.Printf("Command failed with error: %s\n", err.Error())
log.Printf("Stderr: %s\n", stderr.String())
} else {
fmt.Println("Command succeeded:")
fmt.Println(out.String())
}
}
3.运行文件,捕获输出和错误信息
go run run_debug.go
以下是一个运行go test的示例
### 运行 `go test` 的示例代码
```js
package main
import (
"bytes"
"fmt"
"log"
"os/exec"
)
func main() {
// 定义要运行的测试命令
cmd := exec.Command("go", "test", "-v", "-run", "^TestPing$")
// 定义缓冲区来捕获标准输出和标准错误
var out bytes.Buffer
var stderr bytes.Buffer
cmd.Stdout = &out
cmd.Stderr = &stderr
// 运行命令
err := cmd.Run()
if err != nil {
log.Printf("Test command failed with error: %s\n", err.Error())
log.Printf("Stderr: %s\n", stderr.String())
} else {
fmt.Println("Test command succeeded:")
fmt.Println(out.String())
}
}
go run run_debug.go
如果命令失败,将看到如下输出:
Command failed with error: exit status 32
Stderr: some error message here
Command succeeded:
<success message or output>