欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang?并發(fā)下的問題定位及解決方案

 更新時(shí)間:2022年03月15日 15:35:02   作者:張叁問  
由于?gin-swagger?是并發(fā)執(zhí)行的,?輸出的日志本身是錯(cuò)位,這就導(dǎo)致無法定義是哪一個(gè)結(jié)構(gòu)體缺少?tag?導(dǎo)致的,這篇文章主要介紹了Golang?并發(fā)下的問題定位及解決方案,需要的朋友可以參考下

問題描述

在使用 gin-swagger 的過程中, 經(jīng)常會(huì)發(fā)生因?yàn)槿鄙?jsontag 而導(dǎo)致的異常。 由于 gin-swagger 是并發(fā)執(zhí)行的, 輸出的日志本身是錯(cuò)位的。 這就導(dǎo)致無法定義是哪一個(gè)結(jié)構(gòu)體缺少 tag 導(dǎo)致的。

一般而言, 這種時(shí)候只能一個(gè)個(gè)點(diǎn)開去檢查。

解決方案

思路 : 要是每行日志帶當(dāng)前 goroutine_id 的話, 是不是就可以準(zhǔn)確定位到報(bào)錯(cuò)的 goroutine 他打印的日志是哪些了呢!

說做就做

實(shí)現(xiàn)思路

  • 查看當(dāng)前日志是怎么打印的

發(fā)現(xiàn) gin-swagger 日志直接調(diào)用的 golang 的標(biāo)準(zhǔn)庫 log

由于沒有對log初始化, 所以默認(rèn)使用的是 stdout 。

log.Printf("Picking operation from %s\n", aurora.Blue(funType.FullName()))
  • 如果想要給日志中添加 goroutine_id 的話, 就需要在調(diào)用 log.Printf 的時(shí)候獲取當(dāng)前 goroutine 的 id , 所以首先要解決的是怎么獲取 goroutine_id 的問題。

調(diào)研后發(fā)現(xiàn)了集中常見的獲取 goroutine_id 的方法:

2.1 通過棧信息解析后獲取

func GetGID() uint64 {
    b := make([]byte, 64)
    b = b[:runtime.Stack(b, false)]
    b = bytes.TrimPrefix(b, []byte("goroutine "))
    b = b[:bytes.IndexByte(b, ' ')]
    n, _ := strconv.ParseUint(string(b), 10, 64)
    return n
}

2.2 修改 Go 源碼獲取

# src/runtime/runtime2.go
func Goid() int64 {
    _g_ := getg()
    return _g_.goid
}

2.3 通過 CGO 獲取

文件 id.c

#include "runtime.h"
int64 ·Id(void) {
    return g->goid;
}

文件 id.go

package id
func Id() int64

另外還可以通過匯編獲取 goroutine_id

由于go的版本不同,goroutine的結(jié)構(gòu)也可能不同, 所以此處我直接調(diào)用一個(gè)開源實(shí)現(xiàn):

https://github.com/petermattis/goid

  • 修改 gin-swagger main.go 源碼, 修改 log Write 的實(shí)現(xiàn)

修改前

func main() {
    cmd.Execute()
}

修改后

type Out os.File
func (o Out) Write(b []byte) (int, error) {
    prefix := fmt.Sprintf("gid-%d: ", goid.Get())
    all := make([]byte, len(b)+len(prefix))
    all = []byte(prefix)
    all = append(all, b...)
    f := os.File(o)
    return f.Write(all)
}
func main() {
    var out Out
    out = Out(os.Stdout)
    log.SetOutput(out)
    cmd.Execute()

這樣修改后,每次 gin-swagger 調(diào)用 log 打印日志都時(shí)候, 都會(huì)使用我定義的 Write 方法, Write 方法中每次打印前都會(huì)先查詢出當(dāng)前的 goroutine_id ,然后作為日志的前綴。

修改后的日志效果

從中可以看到每行日志開頭,都已經(jīng)加上了 goroutine_id。 只要使用 panic goroutineid 做一次 grep , 即可篩選出需要的日志了,極大的方便了定位問題。

cat /tmp/gin-swagger.log | grep 7647

到此這篇關(guān)于Golang 并發(fā)下的問題定位的文章就介紹到這了,更多相關(guān)Golang并發(fā)問題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 8個(gè)Elasticsearch高頻面試題和答案整理

    8個(gè)Elasticsearch高頻面試題和答案整理

    這篇文章為大家精選了8道Elasticsearch高頻面試題和答案,并且給出了這些知識(shí)點(diǎn)的應(yīng)用場景、也給出了解決這些問題的思路,希望對大家有所幫助
    2023-06-06
  • Go使用協(xié)程交替打印字符

    Go使用協(xié)程交替打印字符

    這篇文章主要介紹了Go使用協(xié)程交替打印字符,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • 揭秘Go Json.Unmarshal精度丟失之謎

    揭秘Go Json.Unmarshal精度丟失之謎

    我們知道在json反序列化時(shí)是沒有整型和浮點(diǎn)型的區(qū)別,數(shù)字都使用同一種類型,在go語言的類型中這種共同類型就是float64,下面我們就來探討一下Json.Unmarshal精度丟失之謎吧
    2023-08-08
  • go?module化?import?調(diào)用本地模塊?tidy的方法

    go?module化?import?調(diào)用本地模塊?tidy的方法

    這篇文章主要介紹了go?module化?import?調(diào)用本地模塊?tidy的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • go如何終止多個(gè)for select循環(huán)嵌套的方法

    go如何終止多個(gè)for select循環(huán)嵌套的方法

    當(dāng)您想從嵌套循環(huán)中中斷,從select內(nèi)部終止循環(huán)時(shí),標(biāo)記的中斷非常有用,本文主要介紹了go如何終止多個(gè)for select循環(huán)嵌套的方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • go build 通過文件名后綴實(shí)現(xiàn)不同平臺(tái)的條件編譯操作

    go build 通過文件名后綴實(shí)現(xiàn)不同平臺(tái)的條件編譯操作

    這篇文章主要介紹了go build 通過文件名后綴實(shí)現(xiàn)不同平臺(tái)的條件編譯操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go程序的init函數(shù)在什么時(shí)候執(zhí)行

    Go程序的init函數(shù)在什么時(shí)候執(zhí)行

    在Go語言中,init?函數(shù)是一個(gè)特殊的函數(shù),它用于執(zhí)行程序的初始化任務(wù),本文主要介紹了Go程序的init函數(shù)在什么時(shí)候執(zhí)行,感興趣的可以了解一下
    2023-10-10
  • Go?env命令如何配置go環(huán)境變量

    Go?env命令如何配置go環(huán)境變量

    這篇文章主要為大家介紹了Go?env如何配置go環(huán)境變量的命令詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Go語言題解LeetCode561數(shù)組拆分

    Go語言題解LeetCode561數(shù)組拆分

    這篇文章主要為大家介紹了Go語言題解LeetCode561數(shù)組拆分示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • go將request?body綁定到不同的結(jié)構(gòu)體中教程

    go將request?body綁定到不同的結(jié)構(gòu)體中教程

    這篇文章主要為大家介紹了go將request?body綁定到不同的結(jié)構(gòu)體中教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10

最新評論