go語(yǔ)言記log: glog剖析

首發(fā): legendtkl.com
log的一個(gè)典型應(yīng)用場(chǎng)景就是實(shí)現(xiàn)log分級(jí)毙死,比如線上環(huán)境不需要記錄DEBUG的log信息。今天介紹一下glog。先看一個(gè)glog的簡(jiǎn)單例子塘砸。

//file name: glog.go
package main

import (
    "flag"
    "github.com/golang/glog"
)

func main() {
    flag.Parse()    // 1

    glog.Info("This is a Info log")         // 2
    glog.Warning("This is a Warning log")
    glog.Error("This is a Error log")

    glog.V(1).Infoln("level 1")     // 3
    glog.V(2).Infoln("level 2")

    glog.Flush()    // 4
}

如果你之前沒(méi)有用過(guò)glog,需要使用go get安裝一下晤锥,你需要像下面這樣執(zhí)行這個(gè)go程序掉蔬。上面標(biāo)注的幾個(gè)地方可以先注意一下,等文章讀完就理解了矾瘾。

$ go get
$ go build glog.go
$ ./glog -log_dir="./"

這時(shí)候不出意外的話女轿,會(huì)在同級(jí)目錄下生成下面幾個(gè)類似的log文件。

glog.kltao-mac.kltao.log.ERROR.20160312-173205.22052
glog.kltao-mac.kltao.log.INFO.20160312-173205.22052
glog.kltao-mac.kltao.log.WARNING.20160312-173205.22052

這就是產(chǎn)生的log文件壕翩,打開(kāi)第一個(gè)ERROR的log文件蛉迹,文件內(nèi)容如下。前面4行是文件響應(yīng)信息放妈,最后一行就是上面第14行代碼記錄的log內(nèi)容北救。

Log file created at: 2016/03/12 17:32:05
Running on machine: kltao-mac
Binary: Built with gc go1.4.2 for darwin/amd64
Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg
E0312 17:32:05.568597   22052 glog.go:15] This is a Error log

這個(gè)時(shí)候如果你打開(kāi)另外兩個(gè)INFO和WARNING的log文件荐操,會(huì)發(fā)現(xiàn)WARNING日志文件中除了WARNING信息還記錄了Error信息(This is a Error log),而INFO日志文件中則記錄了所有的log信息(This is a Info/Warning/Error log)珍策。很容易理解托启,這些log是有等級(jí)的(ERROR>WARNING>INFO),高等級(jí)的日志內(nèi)容會(huì)同時(shí)會(huì)被記錄到低等級(jí)的日志文件中去膛壹。那么glog提供了一個(gè)等級(jí)呢驾中?答案是4個(gè),除了上面提出的3個(gè)模聋,還有一個(gè)FALTAL肩民。

這時(shí)候又有一個(gè)問(wèn)題來(lái)了,為什么第3處的日志信息沒(méi)有記錄下來(lái)呢链方?不急持痰,這個(gè)時(shí)候如下重新執(zhí)行一下。就可以在新的INFO日志文件中找到了對(duì)應(yīng)的信息了祟蚀。

./glog -log_dir="./" -v=3

對(duì)工窍,就是這個(gè)-v參數(shù)。再說(shuō)V之前前酿,先說(shuō)一下glog的命令行解析患雏,對(duì)應(yīng)代碼就是標(biāo)注的第1處。那么glog有多少種參數(shù)呢罢维?

// By default, all log statements write to files in a temporary directory.
// This package provides several flags that modify this behavior.
// As a result, flag.Parse must be called before any logging is done.
//
//  -logtostderr=false
//      Logs are written to standard error instead of to files.
//  -alsologtostderr=false
//      Logs are written to standard error as well as to files.
//  -stderrthreshold=ERROR
//      Log events at or above this severity are logged to standard
//      error as well as to files.
//  -log_dir=""
//      Log files will be written to this directory instead of the
//      default temporary directory.
//
//  Other flags provide aids to debugging.
//
//  -log_backtrace_at=""
//      When set to a file and line number holding a logging statement,
//      such as
//          -log_backtrace_at=gopherflakes.go:234
//      a stack trace will be written to the Info log whenever execution
//      hits that statement. (Unlike with -vmodule, the ".go" must be
//      present.)
//  -v=0
//      Enable V-leveled logging at the specified level.
//  -vmodule=""
//      The syntax of the argument is a comma-separated list of pattern=N,
//      where pattern is a literal file name (minus the ".go" suffix) or
//      "glob" pattern and N is a V level. For instance,
//          -vmodule=gopher*=3
//      sets the V level to 3 in all Go files whose names begin "gopher".

glog.V(1).Infoln("level 1")這行代碼表示設(shè)置的-v參數(shù)大于V()里面的參數(shù)才執(zhí)行后面的Infoln淹仑。如果不加-v參數(shù),默認(rèn)等級(jí)為0肺孵,所以第三處的代碼沒(méi)有執(zhí)行匀借。具體實(shí)現(xiàn)不妨看一下源碼實(shí)現(xiàn),一目了然平窘。

type Verbose bool

func V(level Level) Verbose {
    // This function tries hard to be cheap unless there's work to do.
    // The fast path is two atomic loads and compares.

    // Here is a cheap but safe test to see if V logging is enabled globally.
    if logging.verbosity.get() >= level {
        return Verbose(true)
    }

    // It's off globally but it vmodule may still be set.
    // Here is another cheap but safe test to see if vmodule is enabled.
    if atomic.LoadInt32(&logging.filterLength) > 0 {
        // Now we need a proper lock to use the logging structure. The pcs field
        // is shared so we must lock before accessing it. This is fairly expensive,
        // but if V logging is enabled we're slow anyway.
        logging.mu.Lock()
        defer logging.mu.Unlock()
        if runtime.Callers(2, logging.pcs[:]) == 0 {
            return Verbose(false)
        }
        v, ok := logging.vmap[logging.pcs[0]]
        if !ok {
            v = logging.setV(logging.pcs[0])
        }
        return Verbose(v >= level)
    }
    return Verbose(false)
}

func (v Verbose) Info(args ...interface{}) {
    if v {
        logging.print(infoLog, args...)
    }
}

func (v Verbose) Infoln(args ...interface{}) {
    if v {
        logging.println(infoLog, args...)
    }
}

func (v Verbose) Infof(format string, args ...interface{}) {
    if v {
        logging.printf(infoLog, format, args...)
    }
}

程序中標(biāo)注的4個(gè)地方吓肋,除了第4個(gè)地方,其他都說(shuō)了瑰艘,F(xiàn)lush的作用清空緩沖區(qū)是鬼,就是把日志寫(xiě)到文件。golog初始化的時(shí)候磅叛,起了一個(gè)Flush的守護(hù)進(jìn)程屑咳,然后定期去執(zhí)行I/O操作,所以退出的時(shí)候需要顯示清除一下緩沖區(qū)弊琴。glog啟動(dòng)的初始化代碼如下兆龙。

func init() {
    ...
    go logging.flushDaemon()
}

上面應(yīng)該是glog的大部分使用方法了,更詳細(xì)的信息可以參考github.com/golang/glog

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末紫皇,一起剝皮案震驚了整個(gè)濱河市慰安,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌聪铺,老刑警劉巖化焕,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異铃剔,居然都是意外死亡撒桨,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)键兜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)凤类,“玉大人,你說(shuō)我怎么就攤上這事普气∶瞻蹋” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵现诀,是天一觀的道長(zhǎng)夷磕。 經(jīng)常有香客問(wèn)我,道長(zhǎng)仔沿,這世上最難降的妖魔是什么坐桩? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮封锉,結(jié)果婚禮上撕攒,老公的妹妹穿的比我還像新娘。我一直安慰自己烘浦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布萍鲸。 她就那樣靜靜地躺著闷叉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪脊阴。 梳的紋絲不亂的頭發(fā)上握侧,一...
    開(kāi)封第一講書(shū)人閱讀 51,521評(píng)論 1 304
  • 那天,我揣著相機(jī)與錄音嘿期,去河邊找鬼品擎。 笑死,一個(gè)胖子當(dāng)著我的面吹牛备徐,可吹牛的內(nèi)容都是我干的萄传。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蜜猾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼秀菱!你這毒婦竟也來(lái)了振诬?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤衍菱,失蹤者是張志新(化名)和其女友劉穎赶么,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體脊串,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辫呻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了琼锋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片放闺。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖斩例,靈堂內(nèi)的尸體忽然破棺而出雄人,到底是詐尸還是另有隱情,我是刑警寧澤念赶,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布础钠,位于F島的核電站,受9級(jí)特大地震影響叉谜,放射性物質(zhì)發(fā)生泄漏旗吁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一停局、第九天 我趴在偏房一處隱蔽的房頂上張望很钓。 院中可真熱鬧,春花似錦董栽、人聲如沸码倦。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)袁稽。三九已至,卻和暖如春擒抛,著一層夾襖步出監(jiān)牢的瞬間推汽,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工歧沪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留歹撒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓诊胞,卻偏偏與公主長(zhǎng)得像暖夭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • http://192.168.136.131/sqlmap/mysql/get_int.php?id=1 當(dāng)給sq...
    xuningbo閱讀 10,312評(píng)論 2 22
  • sqlmap用戶手冊(cè) 說(shuō)明:本文為轉(zhuǎn)載鳞尔,對(duì)原文中一些明顯的拼寫(xiě)錯(cuò)誤進(jìn)行修正嬉橙,并標(biāo)注對(duì)自己有用的信息。 ======...
    wind_飄閱讀 2,048評(píng)論 0 5
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理寥假,服務(wù)發(fā)現(xiàn)市框,斷路器,智...
    卡卡羅2017閱讀 134,656評(píng)論 18 139
  • 在應(yīng)用程序中添加日志記錄總的來(lái)說(shuō)基于三個(gè)目的:監(jiān)視代碼中變量的變化情況糕韧,周期性的記錄到文件中供其他應(yīng)用進(jìn)行統(tǒng)計(jì)分析...
    時(shí)待吾閱讀 4,985評(píng)論 0 6
  • 當(dāng)身體給我們發(fā)出信號(hào),你胖了枫振、瘦了、健康了萤彩、生病了粪滤、衣服穿不上了,這時(shí)我們才會(huì)在意我們的身體雀扶。我們?nèi)メt(yī)院杖小,找醫(yī)生,...
    Dflower閱讀 247評(píng)論 0 0