任何線上系統(tǒng)運行日志log都是至關(guān)重要的,當(dāng)系統(tǒng)規(guī)模比較小時不存在系統(tǒng)間的調(diào)用完全是一個自治的系統(tǒng),當(dāng)系統(tǒng)發(fā)展到一定階段勢必需要和周邊關(guān)聯(lián)系統(tǒng)進(jìn)行交互,尤其是在當(dāng)今微服務(wù)盛行的時代,系統(tǒng)間的調(diào)用關(guān)系變得錯綜復(fù)雜,此時log將變得更加至關(guān)重要。
當(dāng)系統(tǒng)崩潰、調(diào)用鏈?zhǔn)〉惹闆r發(fā)生時,log將成為排查問題的唯一入手點,也可作為“甩鍋”的證據(jù)。
在開發(fā)階段我們可以直接輸出到控制臺,便于開發(fā)調(diào)試。但是,在生產(chǎn)環(huán)境我們需要把日志輸出的文件以便查詢和監(jiān)控統(tǒng)計。那是不是說,任何情況下所有的日志都要輸出,各種日志越詳細(xì)越好呢?其實不然,日志輸出到文件勢必涉及到IO操作,大量的日志輸出肯定會影響系統(tǒng)的性能。所以,不同場景配置不同的日志很重要。
任何開發(fā)語言的日志組件都分成了不同的級別,包括debug、info、warn、error等級別。一般在生產(chǎn)環(huán)境會將日志調(diào)整為error級別兼顧性能和排錯。
Go作為一款優(yōu)秀的定位為服務(wù)端分布式集群開發(fā)的語言其內(nèi)置了標(biāo)準(zhǔn)log的支持。
我們先看一下Go語言內(nèi)置log的簡單使用。

以上日志輸出

通過簡單的日志使用,我們看到日志輸出格式是日期時間 日志的msg。在通過日志排錯定位問題的時候我們希望知道日志信息是從哪個代碼文件的什么位置拋出的,go log為我們提供了自定義日志格式的功能,下面是go log包的我們可以控制日志輸出參數(shù),我們可以通過組合的方式進(jìn)行日志格式的定義,以方便我們定位問題排錯。


運行看看結(jié)果

我們看到,日志按照我們定義的格式進(jìn)行了輸出,這樣我們就能快速定位到日志輸出的位置以便排錯。在項目開發(fā)過程中,為了規(guī)劃整個項目的日志格式我們一般會通過init方法統(tǒng)一設(shè)定日志格式。
在實際的生產(chǎn)環(huán)境中我們會將日志統(tǒng)一集中匯集到我們的統(tǒng)一日志處理集群,比如大多數(shù)公司都在使用的ELK,此時區(qū)分不同項目的日志就顯得尤為重要,go log也為我們考慮到了,可以通過調(diào)用SetPrefix方法來設(shè)置日志統(tǒng)一的前綴。
以上我們看到日志都是直接輸出到控制臺,在項目上線后,我們會將日志輸出到文件,通過以下方式我們可以設(shè)置日志打印輸出的位置。

執(zhí)行 go run 后我們查看日志文件,我們可以看到日志正常輸出到了我們指定的文件:

上面我們提到日志分級輸出,我們可以通過go log包為我們提供的基礎(chǔ)功能實現(xiàn)自己的分級日志輸出功能,我們創(chuàng)建一個mylog的目錄(包),編寫一個log_util 的日志類 如下:

運行g(shù)o run example.go


以上是我們通過go語言自帶的log來實現(xiàn)的自己的日志工具。Go社區(qū)很強大,社區(qū)的大佬們?yōu)槲覀儗崿F(xiàn)了更加強大好用的工具類,比如支持按照日期、大小滾動切割文件輸出;有著更細(xì)致的日志級別有更高的更好的性能;支持各種插件可以直接對接elk、prometheus等。下面為大家介紹兩款日志框架:
logrus :?https://github.com/sirupsen/logrus
seelog:https://github.com/cihub/seelog
本節(jié)完。