Linux环境下 golang程序崩溃时的打印信息 如何输出到文件中
在 Linux 环境下,当 Go 程序崩溃时,默认会将崩溃信息(如堆栈跟踪、错误信息等)打印到标准错误输出(stderr)。为了将这些崩溃信息保存到文件中,可以通过以下几种方式实现:
方法 1:重定向标准错误输出到文件
在运行 Go 程序时,可以通过重定向标准错误输出(stderr)将崩溃信息保存到文件中。
./your_go_program 2> crash.log
2>表示将标准错误输出重定向到文件。crash.log是保存崩溃信息的文件名。
示例
./myapp 2> crash.log
如果程序崩溃,崩溃信息会被保存到 crash.log 文件中。
方法 2:结合 stdout 和 stderr 重定向
如果希望将标准输出(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:使用系统工具捕获崩溃信息
如果希望捕获整个程序的输出(包括崩溃信息),可以使用系统工具如 tee 或 script。
使用 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),可以通过调试工具(如 gdb 或 dlv)分析崩溃信息。
启用核心转储
- 确保系统允许生成核心转储文件:
ulimit -c unlimited - 运行程序:
./your_go_program - 如果程序崩溃,会生成一个核心转储文件(通常命名为
core或core.<pid>)。 - 使用
gdb分析核心转储文件:gdb ./your_go_program core
总结
- 简单重定向:使用
2>或2>&1将崩溃信息保存到文件。 - 程序内捕获:使用
log包和recover将崩溃信息写入日志文件。 - 系统工具:使用
tee或script捕获终端输出。 - 核心转储:生成核心转储文件并使用调试工具分析。
Do not communicate by sharing memory; instead, share memory by communicating.

浙公网安备 33010602011771号