如何优化日志堆栈信息打印为字节代码?

137 阅读1分钟

经常使用EasyNVR的用户都知道,作为音视频行业互联网直播产品,EasyNVR主要功能在于通过RTSP/ONVIF协议,接入前端音视频采集设备,通过EasyNVR软硬件将拉取过来的音视频流转化给适合全平台播放的RTMP、HTTP-FLV、HLS格式,极大的方便用户进行网页直播、微信直播及接入自身业务平台。

在测试期间,EasyNVR出现日志显示为数字的一段,无法看出是什么问题。

查看对应的代码为:

log.Printf("handle message failed, %v", p)

log.Println(debug.Stack())

其中 debug.Stack() 返回数据如下:

// Stack returns a formatted stack trace of the goroutine that calls it.

// It calls runtime.Stack with a large enough buffer to capture the entire trace.

func Stack() []byte {

buf := make([]byte, 1024)

for {

n := runtime.Stack(buf, false)

if n < len(buf) {

return buf[:n]

}

buf = make([]byte, 2*len(buf))

}

}

从代码中我们可以得知最终返回的数据是 []byte 类型,因此出现以上问题。

修改代码如下:

if p := recover(); p != nil {

log.Printf("handle message failed, %v", p)

log.Printf("debug stack : %v", string(debug.Stack()))

}

以上代码将返回的 []byte 转换为 string 类型,写入到日志中,即可解决该问题。

EasyNVR可以说已经成为国内视频互联网化基础建设的排头兵,几乎各个民生行业都已经有了EasyNVR视频能力输出的身影,EasyNVR多年服务于各行各业视频基础建设,EasyNVR的可靠性、完整性、稳定性已经受到了业界的广泛认可。