開發服務器程序時如果未經過充分測試, 服務穩定運行一段時間后會突然崩潰退出。一般是因為程序中出現了某個未捕獲的異常。
這類問題屬於偶現的,且需要服務器運行一段時間之后才會出現,難以定位有問題的代碼段。
這中情況下應該將服務進程的stderr重定向至某個文件,這樣當進程因未捕獲的異常導致崩潰時,go運行時會將異常發生時各個協程的調用棧信息記錄下來,便於定位問題。
logFile, err := os.OpenFile("./log/fatal.log", os.O_CREATE|os.O_APPEND|os.O_RDWR, 0660)
if err != nil {
log.Println("服務啟動出錯", "打開異常日志文件失敗" , err)
return
}
// 將進程標准出錯重定向至文件,進程崩潰時運行時將向該文件記錄協程調用棧信息
syscall.Dup2(int(logFile.Fd()), int(os.Stderr.Fd()))
以上代碼利用了linux系統中的dup系統調用,用以將某一文件描述符指向一個新的文件。在windows系統及mac系統下暫時不可用。