Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > GO goroutineid日志

GO日志打印如何添加goroutineid

作者:流子

今天想给日志添加一个前缀,以区分不同goroutine的日志,方便做并发问题的排查,做日志跟踪,下面给大家分享GO日志打印如何添加goroutineid,感兴趣的朋友跟随小编一起看看吧

今天想给日志添加一个前缀,以区分不同goroutine的日志,方便做并发问题的排查,做日志跟踪。
为了解决goroutineid,网上各出奇招,有的使用runtime包未公开的方法获取:

func Goid() int {
    defer func()  {
        if err := recover(); err != nil {
            fmt.Println("panic recover:panic info:%v", err)        }
    }()
    var buf [64]byte
    n := runtime.Stack(buf[:], false)
    idField := strings.Fields(strings.TrimPrefix(string(buf[:n]), "goroutine "))[0]
    id, err := strconv.Atoi(idField)
    if err != nil {
        panic(fmt.Sprintf("cannot get goroutine id: %v", err))
    }
    return id
}

如何引用呢?

func setPrefix(level Level) {
	_, file, line, ok := runtime.Caller(DefaultCallerDepth)
	if ok {
		logPrefix = fmt.Sprintf("[%s][%d][%s:%d]", levelFlags[level], Goid(), filepath.Base(file), line)
	} else {
		logPrefix = fmt.Sprintf("[%s]", levelFlags[level])
	}
	logger.SetPrefix(logPrefix)
}

这个方法我觉得靠谱,显然runtime包是肯定有获取协程id的方法的,因为处理panic时默认会输出问题协程号。但是这样做效率会不会有问题,暂时还不清楚。

到此这篇关于GO日志打印添加goroutineid的文章就介绍到这了,更多相关GO goroutineid内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文