go语言中exec.Command异常捕获

367 阅读1分钟

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>