Linux环境下 golang程序崩溃时的打印信息 如何输出到文件中

在 Linux 环境下,当 Go 程序崩溃时,默认会将崩溃信息(如堆栈跟踪、错误信息等)打印到标准错误输出(stderr)。为了将这些崩溃信息保存到文件中,可以通过以下几种方式实现:


方法 1:重定向标准错误输出到文件

在运行 Go 程序时,可以通过重定向标准错误输出(stderr)将崩溃信息保存到文件中。

./your_go_program 2> crash.log
  • 2> 表示将标准错误输出重定向到文件。
  • crash.log 是保存崩溃信息的文件名。

示例

./myapp 2> crash.log

如果程序崩溃,崩溃信息会被保存到 crash.log 文件中。


方法 2:结合 stdoutstderr 重定向

如果希望将标准输出(stdout)和标准错误输出(stderr)都保存到同一个文件中,可以使用以下命令:

./your_go_program > output.log 2>&1
  • > 表示将标准输出重定向到文件。
  • 2>&1 表示将标准错误输出重定向到标准输出。

示例

./myapp > output.log 2>&1

如果程序崩溃,崩溃信息会和标准输出一起保存到 output.log 文件中。


方法 3:使用 log 包将日志写入文件

在 Go 程序中,可以通过 log 包将日志信息(包括崩溃信息)写入文件。结合 recover 捕获 panic,可以将崩溃信息记录到日志文件中。

示例代码

package main

import (
	"fmt"
	"log"
	"os"
	"runtime/debug"
)

func main() {
	// 创建日志文件
	logFile, err := os.OpenFile("crash.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
	if err != nil {
		log.Fatal("Failed to open log file:", err)
	}
	defer logFile.Close()

	// 设置日志输出到文件
	log.SetOutput(logFile)

	// 捕获 panic
	defer func() {
		if r := recover(); r != nil {
			log.Printf("Program crashed: %v\n", r)
			log.Println("Stack trace:")
			log.Println(string(debug.Stack()))
		}
	}()

	// 模拟崩溃
	panic("Oops! Something went wrong!")
}

说明

  • 使用 log.SetOutput 将日志输出重定向到文件。
  • 使用 recover 捕获 panic,并将崩溃信息和堆栈跟踪写入日志文件。
  • 崩溃信息会被保存到 crash.log 文件中。

方法 4:使用系统工具捕获崩溃信息

如果希望捕获整个程序的输出(包括崩溃信息),可以使用系统工具如 teescript

使用 tee

./your_go_program 2>&1 | tee output.log
  • 2>&1 将标准错误输出重定向到标准输出。
  • tee 将输出同时显示在终端并保存到文件中。

使用 script

script -c "./your_go_program" output.log
  • script 会记录终端的所有输出(包括崩溃信息)并保存到 output.log 文件中。

方法 5:使用核心转储(Core Dump)

如果程序崩溃时生成了核心转储文件(core dump),可以通过调试工具(如 gdbdlv)分析崩溃信息。

启用核心转储

  1. 确保系统允许生成核心转储文件:
    ulimit -c unlimited
    
  2. 运行程序:
    ./your_go_program
    
  3. 如果程序崩溃,会生成一个核心转储文件(通常命名为 corecore.<pid>)。
  4. 使用 gdb 分析核心转储文件:
    gdb ./your_go_program core
    

总结

  • 简单重定向:使用 2>2>&1 将崩溃信息保存到文件。
  • 程序内捕获:使用 log 包和 recover 将崩溃信息写入日志文件。
  • 系统工具:使用 teescript 捕获终端输出。
  • 核心转储:生成核心转储文件并使用调试工具分析。
posted @ 2025-03-11 15:04  guanyubo  阅读(257)  评论(0)    收藏  举报