楔子
zap一款高性能日志框架,由于業(yè)務(wù)場景需要,也對(duì)比了一些主流的日志框架,最后權(quán)衡選擇它比較適合峰髓。
準(zhǔn)備工作
根據(jù)官方教程工禾,以及相關(guān)文章瘫怜,迅速簡單搭建淺淺封裝一層于是代碼如下非常簡單:
大概流程通過New()方法讀取配置文件創(chuàng)建相應(yīng)的級(jí)別以及日志輸出格式控制更扁,然后返回一個(gè)日志句柄賦值給_logger和_sugger.
OK到目前為止準(zhǔn)備工作基本完成
問題復(fù)現(xiàn)
我們先打一條日志
conf.New()方法為讀取配置文件,然后把日志文件的配置傳給log.New()對(duì)象,然后我們調(diào)用log.Infof()方法打印日志翰铡。好的日志打印出來了,但是仔細(xì)看日志內(nèi)容發(fā)現(xiàn)了問題饵溅,如圖4
如你所見多出了'[]'中括號(hào)妨退,為什么?難道是[%s]格式verb動(dòng)詞的緣故蜕企?于是更改下格式再次打印如下:
看來不是這個(gè)緣故了,確實(shí)有些匪夷所思,起初我以為我沒用對(duì)zap,姿勢不對(duì)咬荷,于是我從zap配置上入手,我改成了json模式(當(dāng)前是conlse)以及相關(guān)的配置都沒有生效轻掩,再后來我上githu上搜了一圈也沒有搜到幸乒,這讓我有些摸不著頭腦,難道是bug唇牧?當(dāng)時(shí)想發(fā)起一個(gè)issue了罕扎,但是我想這不太可能,這種問題相對(duì)而言比較低級(jí)丐重,肯定有人碰到過腔召,或者說是一個(gè)低級(jí)錯(cuò)誤,才沒有相應(yīng)的文章扮惦,于是我開始追源代碼臀蛛,大概看了一下也沒有看到什么問題,但是有一處看著比較可疑于是開了DEBUG模式如下:
注意標(biāo)注的值變化,繼續(xù)追蹤
此刻我們發(fā)現(xiàn)s:=string(p.buf)這行的值其實(shí)已經(jīng)就是我們要打印的實(shí)際內(nèi)容了浊仆,從而也發(fā)現(xiàn)%s 動(dòng)詞 也被替換成了 [go] ,ok到這其實(shí)問題已經(jīng)差不多明朗了客峭。那么再看下如下代碼來說明這個(gè)問題。
這次問題明朗了氧卧,其實(shí)就是go語法糖的問題桃笙, v... 這種方式就是把切片對(duì)象給打散,相當(dāng)于拆分成多個(gè)單個(gè)對(duì)象沙绝,而直接傳v相當(dāng)于傳了一個(gè)整體切片對(duì)象,切片對(duì)象打印當(dāng)然是[]這種形式了搏明。回過頭來再看下代碼闪檬,
果然沒采用把參數(shù)打散的形式傳參,相當(dāng)于傳了一個(gè)切片對(duì)象,只需要把a(bǔ)rgs后面加上三個(gè)點(diǎn)即可,測試如下:
結(jié)語
golang雖然語法相對(duì)簡單容易上手星著,但是有些意想不到的坑讓你著實(shí)抓狂,但每次遇到問題都會(huì)讓你學(xué)到一些新的東西,對(duì)go的認(rèn)知更加深刻粗悯。
此外還有一個(gè)問題虚循,就是當(dāng)infof逗號(hào)后邊的參數(shù)大于等于兩個(gè)以上時(shí),第二個(gè)參數(shù)會(huì)造成不能替換的問題,原因還是傳切片對(duì)象的緣故样傍。
水一篇文章横缔。。衫哥。
一個(gè)用golang得尵ジ眨科生
完~