golang panic信息捕獲

背景

我們的日志接入阿里云sls平臺,但是,日志是以json的格式存儲在阿里云sls平臺上,程序中產生的error,info等日志都可以實現以json的格式打印。但是,golang程序中產生的panic信息本身不是以json的格式輸出,這就導致panic信息在阿里云sls平臺上不方便檢索。

基于上述痛點,我們期望捕獲程序的panic信息,并且以json的格式打印,如此,我們就可以方便的實現在阿里云sls平臺上檢索的目的。

解決方案

核心的思路

通過deferrecover()機制捕獲panic信息,結合Go的JSON序列化能力,將堆棧信息、錯誤內容等關鍵數據封裝為結構化JSON格式。

實現步驟

定義日志的結構體

日志結構體定義:

type PanicLog struct {Timestamp string `json:"@timestamp"`Level     string `json:"level"`Message   string `json:"message"`Stack     string `json:"stack"`Service   string `json:"service"`
}

?封裝打印日志的方法

func logPanicAsJSON(panicObj interface{}) {stack := string(debug.Stack()) // 獲取完整堆棧logEntry := PanicLog{Timestamp: time.Now().Format(time.RFC3339),Level:     "PANIC",Message:   fmt.Sprintf("%v", panicObj),Stack:     stack,Service:   "your-service-name",}jsonData, _ := json.Marshal(logEntry)// 輸出到SLS(根據實際日志庫選擇方式)log.Println(string(jsonData) )
}

封裝方法捕獲panic

defer func() {if r := recover(); r != nil {logPanicAsJSON(r) // 記錄 panic 信息c.AbortWithStatus(http.StatusInternalServerError)}
}()

測試案例

package mainimport ("encoding/json""fmt""log""os""runtime/debug""time"
)type PanicLog struct {Timestamp string `json:"@timestamp"`Level     string `json:"level"`Message   string `json:"message"`Stack     string `json:"stack"`Service   string `json:"service"`
}func main() {defer func() {if r := recover(); r != nil {// 捕獲panic信息并轉換為JSONlogPanicAsJSON(r)os.Exit(1)}}()// 業務代碼...testPanic()time.Sleep(1 * time.Second)
}func testPanic() {// nil指針引發panicvar a *int*a = 1
}func logPanicAsJSON(panicObj interface{}) {stack := string(debug.Stack()) // 獲取完整堆棧logEntry := PanicLog{Timestamp: time.Now().Format(time.RFC3339),Level:     "PANIC",Message:   fmt.Sprintf("%v", panicObj),Stack:     stack,Service:   "your-service-name",}jsonData, _ := json.Marshal(logEntry)// 輸出到SLS(根據實際日志庫選擇方式)log.Println(string(jsonData))
}

注意事項

在Go語言里,recover()?函數只能捕獲當前goroutine內產生的?panic

所以,在下面的這個案例中recover不能捕獲到panic信息。如果需要捕獲到,需要在每個協程中都執行recover的邏輯。

func main() {defer func() {if r := recover(); r != nil {// 捕獲panic信息并轉換為JSONlogPanicAsJSON(r)os.Exit(1)}}()// 業務代碼...go func() {testPanic()}()time.Sleep(1 * time.Second)
}

擴展優化

日志結構體中增加traceId信息維度。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70228.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70228.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70228.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

攔截器VS過濾器:Spring Boot中請求處理的藝術!

目錄 一、攔截器(Interceptor)和過濾器(Filter):都是“守門員”!二、如何實現攔截器和過濾器?三、攔截器和過濾器的區別四、執行順序五、真實的應用場景六、總結 🌟如果喜歡作者的講…

FastGPT及大模型API(Docker)私有化部署指南

??歡迎關注【AI技術開發者】 ? 經過優化,在不影響FastGPT功能的情況下,大幅降低了部署的設備配置要求,僅需1c1h即可正常部署使用。 官方要求配置: ? ? 優化后的實際占用情況: 運行內存僅需370M&#xff08…

解決 WSL Ubuntu 中 /etc/resolv.conf 自動重置問題

解決 WSL Ubuntu 中 /etc/resolv.conf 自動重置問題 前言問題描述問題原因嘗試過的命令及分析解決方案:修改 wsl.conf 禁用自動生成總結 前言 在使用 Windows Subsystem for Linux (WSL) 的 Ubuntu 子系統時,你可能會遇到 /etc/resolv.conf 文件被自動重…

【第15章:量子深度學習與未來趨勢—15.3 量子深度學習在圖像處理、自然語言處理等領域的應用潛力分析】

一、開篇:為什么我們需要關注這場"量子+AI"的世紀聯姻? 各位技術愛好者們,今天我們要聊的這個話題,可能是未來十年最值得押注的技術革命——量子深度學習。這不是簡單的"1+1=2"的物理疊加,而是一場可能徹底改寫AI發展軌跡的范式轉移。 想象這樣一個…

企業軟件合規性管理:構建高效、安全的軟件資產生態

引言 在數字化轉型的浪潮下,企業的軟件使用方式日益多元化,涉及云端、訂閱制、永久授權及浮動許可等多種模式。然而,隨著軟件資產的增多,企業面臨著合規性管理的嚴峻挑戰:非法軟件使用、許可證管理不當、軟件資產閑置…

python學習筆記,python處理 Excel、Word、PPT 以及郵件自動化辦公

文章目錄 前言一、環境搭建1. 下載 Python2. 安裝 Python 二、處理 Excel 文件(openpyxl庫)三、 處理 Word 文件(python-docx庫)四、 處理 PPT 文件(python-pptx庫)五、 自動發送郵件(smtplib和…

Python 基礎-循環

目錄 簡介 break continue 小結 簡介 要計算123,我們可以直接寫表達式: >>> 1 2 3 6要計算123...10,勉強也能寫出來。 但是,要計算123...10000,直接寫表達式就不可能了。 為了讓計算機能計算成千上…

簡單易懂,解析Go語言中的Channel管道

Channel 管道 1 初始化 可用var聲明nil管道;用make初始化管道; len(): 緩沖區中元素個數, cap(): 緩沖區大小 //變量聲明 var a chan int //使用make初始化 b : make(chan int) //不帶緩沖區 c : make(chan stri…

python-leetcode 36.二叉樹的最大深度

題目: 給定一個二叉樹root,返回其最大深度 二叉樹的最大深度是指從根節點到最遠葉子節點的最長路徑上的節點數 方法一:深度優先搜索 知道了左子樹和右子樹的最大深度l和r,那么該二叉樹的最大深度即為:max(l,r)1 而左子樹和右子樹的最大深…

RESTful 的特點與普通 Web API 的區別

RESTful 是一種設計風格,而不僅僅是普通的 Web API。它遵循一些特定的原則和約束,使得 API 更加簡潔、可擴展和易于理解。以下是 RESTful 的特點,以及與普通 Web API 的區別: RESTful 的特點 1. 資源導向 RESTful API 的核心是資…

結構風荷載理論與Matlab計算

結構風荷載理論與matlab計算的實例程序,適合初學者理解matlab風荷載計算 資源文件列表 程序_結構風荷載理論與Matlab計算/chapter1/exam_simWind_1_1.m , 1035 程序_結構風荷載理論與Matlab計算/chapter1/Extrmv.m , 303 程序_結構風荷載理論與Matlab計算/chapter1…

numpy(02 數據類型和數據類型轉換)

numpy(01 入門) 目錄 一、Python NumPy 數據類型 1.1 NumPy 基本類型 1.2 數據類型對象 (dtype) 1.3 具體實例 二、Numpy數據類型轉換 2.1 浮點數據轉換 2.2 整型數據轉換 2.3 浮點數轉整數 一、Python NumPy 數據類型 1.1 NumPy 基本類型 下表列舉了常用 NumPy 基…

【雅思博客04】Silence please!

A: Those people in front of us are making so much noise. It’s so inconsiderate! B: Don’t worry about it; it’s not such a big deal. A: Oh... I can’t hear a thing! Excuse me, can you keep it down? C: Sure, sorry about that! A: Someone’s phone is ri…

【大語言模型_3】ollama本地加載deepseek模型后回答混亂問題解決

背景: 本地下載了DeepSeek-R1-Distill-Qwen-7B模型后,通過ollama create DeepSeek-R1-Distill-Qwen-7B -f ds7b.mf加載模型啟動后回答混亂,無法使用。 解決方法 重新下載模型,選擇了DeepSeek-R1-Distill-Qwen-7B-Q4_K_M.gguf 重…

nginx ngx_http_module(9) 指令詳解

nginx ngx_http_module(9) 指令詳解 nginx 模塊目錄 nginx 全指令目錄 一、目錄 1.1 模塊簡介 ngx_http_uwsgi_module:uWSGI支持模塊,允許Nginx與uWSGI服務器進行通信。uWSGI是一種應用服務器協議,廣泛用于Python Web應用的部署。通過該…

用PyInstaller構建動態腳本執行器:嵌入式Python解釋器與模塊打包 - 簡明教程

技術場景: 需分發的Python工具要求終端用戶可動態修改執行邏輯將Python環境與指定庫(如NumPy/Pandas)嵌入可執行文件實現"一次打包,動態擴展"的輕量化解決方案。 ▌ 架構設計原理 1. 雙模運行時識別 # 核心判斷邏輯…

山石網科×阿里云通義靈碼,開啟研發“AI智造”新時代

近日,山石網科正式宣布全面接入阿里云通義靈碼企業專屬版,這標志著山石網科在研發智能化、自動化領域邁出重要一步,為研發工作注入強大的AI動力,實現多維度的效率飛躍。 此次合作,阿里云通義靈碼依托強大的AI能力&…

《被討厭的勇氣》(六)

1.自由就是被別人討厭。 2.毫不在意別人的評價、不害怕被別人討厭、不追求被他人認可,如果不付出以上這些代價,那就無法貫徹自己的生活方式,也就是不能獲得自由。 3.在意你的臉的只有你自己。 4.不去干涉別人的課題也不讓別人干涉自己的課題.…

使用 PyTorch 實現標準卷積神經網絡(CNN)

卷積神經網絡(CNN)是深度學習中的重要組成部分,廣泛應用于圖像處理、語音識別、視頻分析等任務。在這篇博客中,我們將使用 PyTorch 實現一個標準的卷積神經網絡(CNN),并介紹各個部分的作用。 什…

SpringBoot2.0整合Redis(Lettuce版本)

前言: 目前java操作redis的客戶端有jedis跟Lettuce。在springboot1.x系列中,其中使用的是jedis, 但是到了springboot2.x其中使用的是Lettuce。 因為我們的版本是springboot2.x系列,所以今天使用的是Lettuce。關于jedis跟lettuce的區別&#…