精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何使用GO語言從零實現日志包

開發 前端
從頭開發一個日志包,可以讓我們了解日志包的底層邏輯,使得我們對日志包有定制需求的時候,可以能夠基于開源的日志包實現我們的功能。

背景

當前的開源日志包有很多,像go中的標準庫log包、glog、logrus、zap。它們每種日志包都有相應的應用場景。四種日志包相關對比如下所示:

標準庫log

功能簡單,不支持日志級別、日志格式。但是使用簡單,易于快速上手。大型項目較少使用

glog

提供了日志包的基本功能,像日志級別、格式等。適合一些小項目

logrus

功能強大,不僅實現了基本日志功能,還提供了很多高級功能。適合大型項目

zap

功能強大,性能高,適合對日志性能要求高的項目。另外zap的子包zapcore提供了很多底層日志接口,適合二次開發

從頭開發一個日志包,可以讓我們了解日志包的底層邏輯,使得我們對日志包有定制需求的時候,可以能夠基于開源的日志包實現我們的功能。所以本文以cuslog為例,看看如何實現我們自己的日志包(代碼:
https://github.com/marmotedu/gopractise-demo/tree/master/log/cuslog)。

代碼結構

cuslog目錄代碼結構

cuslog代碼結構

要實現一個日志包,就需要實現下面三個基本的對象,Entry,Logger,Options。

Entry

代碼:
https://github.com/marmotedu/gopractise-demo/blob/master/log/cuslog/entry.go。

//構造函數
func entry(logger *logger) *Entry {
return &Entry{logger: logger, Buffer: new(bytes.Buffer), Map: make(map[string]interface{}, 5)}
}
/*entry主要方法是write方法,它首先通過e.logger.opt.level 與 level的比較,來判斷
是否要將日志輸出,其中DEBUG最低,FATAL最高,這個從
https://github.com/marmotedu/gopractise-demo/blob/master/log/cuslog/options.go#L19
中可以看到。
*/
func (e *Entry) write(level Level, format string, args ...interface{}) {
if e.logger.opt.level > level {
return
}
e.Time = time.Now()
e.Level = level
e.Format = format
e.Args = args
if !e.logger.opt.disableCaller {
if pc, file, line, ok := runtime.Caller(2); !ok {
e.File = "???"
e.Func = "???"
} else {
e.File, e.Line, e.Func = file, line, runtime.FuncForPC(pc).Name()
e.Func = e.Func[strings.LastIndex(e.Func, "/")+1:]
}
}
e.format()
e.writer()
e.release()
}

Entry的write方法實現了將它Buffer中的數據,寫入到它的logger所配置的output中。

Logger

代碼:
https://github.com/marmotedu/gopractise-demo/blob/master/log/cuslog/logger.go。

/*創建方法,通過sync.Pool緩存對象,提升性能,initOptions是用于初始化logger的options的
各種屬性*/
func New(opts ...Option) *logger {
logger := &logger{opt: initOptions(opts...)}
logger.entryPool = &sync.Pool{New: func() interface{} { return entry(logger) }}
return logger
}

Options

代碼:
https://github.com/marmotedu/gopractise-demo/blob/68e100ee78a3093e6f2434439e7d4b143b9ebf60/log/cuslog/options.go。

/*opts 參數是一系列的用于設置options屬性的函數,比如下面的WithOutput和WithLevel
都是這種函數,initOptions會接收這些函數作為輸入,對o = &options{}進行設置*/
type Option func(*options)

func initOptions(opts ...Option) (o *options) {
o = &options{}
for _, opt := range opts {
opt(o)
}

if o.output == nil {
o.output = os.Stderr
}

if o.formatter == nil {
o.formatter = &TextFormatter{}
}

return
}

func WithOutput(output io.Writer) Option {
return func(o *options) {
o.output = output
}
}

func WithLevel(level Level) Option {
return func(o *options) {
o.level = level
}
}

應用

通過下面的代碼,我們看看整個代碼是如何串起來的。

// 輸出到文件
fd, err := os.OpenFile("test.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
log.Fatalln("create file test.log failed")
}
defer fd.Close()

l := cuslog.New(cuslog.WithLevel(cuslog.InfoLevel),
cuslog.WithOutput(fd),
cuslog.WithFormatter(&cuslog.JsonFormatter{IgnoreBasicFields: false}),
)
l.Info("custom log with json formatter")
  1. 上面的整體實現是,將"custom log with json formatter"這段字符串寫入到指定文件里面
  2. 1到6行創建并打開文件
  3. 重點是8行,cuslog.WithLevel(cuslog.InfoLevel)、cuslog.WithOutput(fd)、cuslog.WithFormatter(&cuslog.JsonFormatter{IgnoreBasicFields: false})三個函數調用,返回三個函數func(o *options),這些函數都是Option類型,因為type Option func(*options)。
  4. 然后調用cuslog.New,這個函數上面也給出了,它里面通過initOptions依次調用上面的Option函數,對options對象進行設置,然后把options賦給opt, 并創建logger. logger := &logger{opt: initOptions(opts...)}
  5. 最后調用l.Info("custom log with json formatter")把字符串輸出到文件中.整個調用鏈是l.info===>通過l的pool獲取entry===>調用entry的write(InfoLevel, FmtEmptySeparate, args...),在這個write函數里面,只有infoLevel比logger.level優先級大或相等,才輸出。并且通過runtime.Caller(2)獲取最上層調用info時的,文件名,行號,函數名等信息。因為這個地方有2層嵌套才調用到entry的write,所以runtime.Caller(2)的參數是2

總結

上面的代碼實現了基本的日志功能,包括日志級別、日志格式配置、輸出文件或標準輸出的設置。但是一些高級的功能,比如按級別分類輸出,Hook能力,結構化日志。這些目前都不支持。

責任編輯:姜華 來源: 今日頭條
相關推薦

2023-02-13 00:24:37

Go語言日志庫

2024-02-01 13:30:53

Go語言開發

2020-03-17 10:24:12

Go語言停止寫障礙

2024-02-06 17:57:06

Go語言任務

2020-08-12 08:56:30

代碼凱撒密碼函數

2021-05-13 17:02:38

MDC腳手架日志

2023-10-13 19:42:00

2022-08-08 08:31:55

Go 語言閉包匿名函數

2022-08-08 06:50:06

Go語言閉包

2023-11-07 14:30:28

Python開發

2017-11-16 15:25:54

Go語言算法代碼

2021-04-09 20:04:34

區塊鏈Go加密

2021-06-08 07:45:44

Go語言優化

2024-10-08 10:57:04

2024-03-12 09:13:28

Go語言main

2018-08-20 08:15:50

編程語言Go語言切片

2022-11-03 20:38:01

CMD命令Go

2024-04-26 09:04:13

2019-12-03 09:31:14

編程語言程序員Python

2021-01-06 09:47:51

內存Go語言
點贊
收藏

51CTO技術棧公眾號

欧美日韩精品免费在线观看视频| 欧美激情精品久久久久久| 91色国产在线| 成人国产免费电影| 91女人视频在线观看| 国产精品自拍偷拍视频| 激情综合网五月婷婷| 欧美日韩精品一区二区视频| 欧美成人综合网站| 欧美特级aaa| 久久不射影院| 国产精品白丝在线| 黑人中文字幕一区二区三区| 91中文字幕在线播放| 制服诱惑一区二区| 久久成人av网站| 亚洲精品国产一区黑色丝袜| 岛国av一区| 欧美一区二区福利在线| www亚洲成人| 不卡福利视频| 亚洲成av人片一区二区梦乃| 性生活免费观看视频| 国产毛片在线看| 99久久精品国产麻豆演员表| 97se亚洲综合在线| 国产又粗又猛又爽| 青青草一区二区三区| 欧美中在线观看| xxxxxx国产| 很黄很黄激情成人| 久久综合免费视频| 亚洲欧美精品aaaaaa片| av影片在线一区| 亚洲欧美在线播放| 中文字幕无码人妻少妇免费| 136导航精品福利| 日韩视频一区在线观看| 伊人色在线观看| 日本美女久久| 欧美三级视频在线播放| 日本成人中文字幕在线| 成人做爰视频www网站小优视频| 精品国产老师黑色丝袜高跟鞋| 日韩一级特黄毛片| 久草在线视频资源| 亚洲最新在线观看| 日本丰满少妇xxxx| 电影在线观看一区| 婷婷夜色潮精品综合在线| 精品久久久久久无码中文野结衣| 毛片在线网址| 午夜精品久久久久久不卡8050| 久久久国内精品| 黄网av在线| 亚洲国产成人va在线观看天堂| 福利视频一二区| 韩国精品一区| 91国偷自产一区二区三区观看 | 强伦人妻一区二区三区| 一区二区三区视频免费观看| 亚洲视频综合网| 久久视频精品在线观看| 久久在线电影| 久久亚洲精品网站| 精品肉丝脚一区二区三区| 亚洲黄色天堂| 欧美亚洲第一页| 美女黄页在线观看| 国产精品亚洲成人| 国产精品久久久对白| 青青青手机在线视频观看| 久久久久久久综合色一本| 亚洲天堂电影网| 亚洲无线看天堂av| 精品久久久久久久久久久久久| 四虎永久在线精品无码视频| 久久亚洲精品人成综合网| 91精品国产手机| 国产一级二级视频| 波多野结衣在线播放一区| 久久精品国产96久久久香蕉| 久热精品在线观看| 日韩综合一区二区| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲av无码专区在线| 91丨porny丨蝌蚪视频| 一区二区三区精品国产| 免费高清完整在线观看| 婷婷国产v国产偷v亚洲高清| 久热精品在线播放| 国产精品毛片av| 综合网日日天干夜夜久久| 精品无码人妻一区二区三区| 日韩 欧美一区二区三区| 波多野结衣久草一区| 国产在线一在线二| 亚洲一区在线观看视频| 九色porny91| 国产精品对白久久久久粗| 在线亚洲国产精品网| 国产精品99精品无码视| 免费日本视频一区| 久久久久资源| a在线免费观看| 欧美视频在线观看一区| 久久久久久婷婷| 色喇叭免费久久综合| 88xx成人精品| 精品人妻一区二区三区日产乱码| 国产午夜亚洲精品羞羞网站| 国产xxxx振车| 国产精品99久久免费| 国产午夜一区二区| 欧美精品二区三区| 国产91丝袜在线播放0| 亚洲精品tv久久久久久久久| 色在线中文字幕| 亚洲电影第1页| 青娱乐av在线| 激情另类小说区图片区视频区| 国产日韩精品久久| 青青青草视频在线| 91高清在线| 亚洲国产精品黑人久久久| 一卡二卡三卡视频| 网站一区二区| 久久网福利资源网站| 中文字幕欧美人妻精品| 91色婷婷久久久久合中文| 国产乱淫av片杨贵妃| 欧美黄色一级| 美女少妇精品视频| 国产精品视频一区二区三区,| 国产日韩欧美不卡在线| 老熟妇仑乱视频一区二区| 五月激激激综合网色播| 97在线免费观看| 婷婷在线免费视频| 午夜影视日本亚洲欧洲精品| 污网站免费观看| 伊人成人在线| 精品视频在线观看| 最新中文字幕在线播放| 日韩国产精品一区| 成年人视频在线免费看| 久久久亚洲午夜电影| 毛片一区二区三区四区| 免费成人av| 国产精品久久中文| av在线之家电影网站| 欧美色图12p| 国产人与禽zoz0性伦| 麻豆视频观看网址久久| av动漫免费观看| 亚洲高清在线一区| 久久久天堂国产精品女人| 日本高清视频网站| 欧美日韩色婷婷| 97超碰在线资源| 免费欧美在线视频| 国产资源第一页| 国产乱论精品| 国产成人精品电影| 日本欧美在线视频免费观看| 日韩欧美国产一区二区在线播放| 豆国产97在线 | 亚洲| 久久综合给合久久狠狠狠97色69| 无码少妇一区二区三区芒果| 欧美h版在线| 国产精品免费视频一区二区| 在线免费三级电影网站| 中文字幕久久久av一区| va视频在线观看| 精品高清一区二区三区| 中字幕一区二区三区乱码| 国产乱子轮精品视频| 欧美综合在线播放| 99精品在线| 国产三区精品| www.久久.com| 久久噜噜噜精品国产亚洲综合 | 亚洲社区在线观看| 国产精品区在线观看| 精品日韩美女的视频高清| 手机免费观看av| a美女胸又www黄视频久久| 中文字幕第38页| 一区二区日本视频| 玖玖精品在线视频| 亚洲国产欧美日韩在线观看第一区| 91精品国产自产在线老师啪 | 午夜精品久久| 欧美日韩国产综合在线| 欧一区二区三区| 日本精品性网站在线观看| 超碰在线无需免费| 在线观看视频99| 日本激情视频网站| 欧美顶级少妇做爰| 国产一级一级国产| 亚洲成人动漫在线观看| 精品无码久久久久成人漫画| 久久久久久久久97黄色工厂| 欧洲熟妇的性久久久久久| 精品亚洲国产成人av制服丝袜| 大肉大捧一进一出好爽视频| 午夜亚洲福利| 一区二区三区四区不卡| 久久av免费| 国产一级特黄a大片99| 国产一区一区| 国产精品久久久久久久午夜| 日韩欧美一中文字暮专区| 欧美成人黑人xx视频免费观看| av播放在线观看| 亚洲欧美制服另类日韩| 天堂在线资源8| 精品黑人一区二区三区久久 | 国产真实精品久久二三区| 久久久久久久久久久福利| 国户精品久久久久久久久久久不卡| 久久久一二三四| 日本高清免费电影一区| 欧美日韩中文国产一区发布 | 日韩精品在线第一页| 亚洲精品免费在线观看视频| 91精品免费观看| 91麻豆成人精品国产| 欧美吻胸吃奶大尺度电影| 久久久精品视频网站| 色综合天天做天天爱| 久热这里只有精品6| 精品国产乱码久久久久久婷婷| 国产乡下妇女做爰毛片| 亚洲成人在线网站| 国产污片在线观看| 午夜不卡av免费| 日韩男人的天堂| 精品国产户外野外| 亚洲欧美一二三区| 欧美在线免费观看视频| 欧美人一级淫片a免费播放| 日本精品免费观看高清观看| 黄色大全在线观看| 欧美日韩精品一区视频| 一级久久久久久久| 91精品欧美福利在线观看| 国产高清视频免费| 欧美精品一区二区不卡| 天堂在线资源库| 亚洲四色影视在线观看| 国产三级在线观看| 日韩日本欧美亚洲| 三级网站视频在在线播放| 国语自产精品视频在免费| 中文字幕成在线观看| 国产福利成人在线| yiren22亚洲综合| 亚洲精品女av网站| 国产在线播放精品| 日韩av影视| 99精品视频在线观看播放| 日韩不卡视频一区二区| 亚洲久久在线| 久久精品一区二| 国内成人自拍视频| 美女搡bbb又爽又猛又黄www| 久久久青草青青国产亚洲免观| 国产综合精品久久久久成人av| 成人欧美一区二区三区| 久久免费小视频| 一本大道久久a久久综合婷婷| 一卡二卡三卡在线| 亚洲国产成人精品久久| wwwww在线观看免费视频| 欧美二区在线播放| 88xx成人永久免费观看| 91在线视频成人| 天堂99x99es久久精品免费| 一区二区三区精品国产| 亚洲精品乱码久久久久久蜜桃麻豆| 日韩精品一区二区三区色欲av| 国产精品影视在线| 无码熟妇人妻av| 亚洲黄色性网站| 无码人妻丰满熟妇精品| 日韩精品一区二区三区在线 | 清纯唯美亚洲经典中文字幕| 中文字幕一区二区三区5566| 日韩五码在线| 天堂网成人在线| 久久久久久9999| 久一区二区三区| 欧美精品在线一区二区三区| 四虎影院在线域名免费观看| 久久国产精品久久久久久| 日韩欧美另类一区二区| 99re视频在线观看| 日韩三级在线| 日韩av片在线看| 国产不卡在线播放| 免费精品在线视频| 91成人在线免费观看| 韩国中文字幕hd久久精品| 久久精品国产亚洲一区二区 | 欧美日韩综合在线| 亚洲AV成人无码一二三区在线| 美女少妇精品视频| 日日夜夜一区| 日韩aⅴ视频一区二区三区| 亚洲理伦在线| 亚洲精品鲁一鲁一区二区三区| 国产精品久久久久影院色老大| 波多野结衣 久久| 亚洲精品久久久久久久久久久| 国产黄大片在线观看画质优化| 国产精品偷伦视频免费观看国产| 国产成人调教视频在线观看| 国产精品久久中文字幕| 成人深夜福利app| 欧美毛片在线观看| 91精品国产色综合久久不卡电影| 国产高清视频免费最新在线| 欧美在线亚洲在线| 日韩理论电影中文字幕| 又粗又黑又大的吊av| 成人激情黄色小说| 国产一级一片免费播放| 亚洲精品一区二区三区福利| 18在线观看的| 91手机在线视频| 午夜欧美精品久久久久久久| 婷婷激情小说网| 亚洲免费看黄网站| 国内精品久久久久久久久久| 久久亚洲精品小早川怜子66| 国产成人久久精品一区二区三区| 手机成人av在线| 国产美女精品一区二区三区| 中文字幕另类日韩欧美亚洲嫩草| 日韩一区二区在线看| 在线播放免费av| 97se视频在线观看| 日韩视频三区| 88久久精品无码一区二区毛片| 色女孩综合影院| 亚洲1卡2卡3卡4卡乱码精品| 成人精品一区二区三区电影免费| 国产精品久久占久久| 国内av免费观看| 亚洲午夜久久久久久久久电影网 | 国产91精品久久久久| 欧美大奶一区二区| 又色又爽又高潮免费视频国产| 久久久99精品久久| 国产又粗又猛又爽| 久久久久久国产免费| 卡一精品卡二卡三网站乱码| 欧美日韩在线中文| 日本一区二区在线不卡| 国产又色又爽又黄又免费| 久久综合网hezyo| 国产ts一区| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 国产人成一区二区三区影院| 国产免费av观看| 亚州av一区二区| 成人羞羞网站| 好吊操视频这里只有精品| 亚洲成人激情自拍| 国产高清在线| 99视频网站| 日韩国产精品久久久| 99久久婷婷国产综合| 亚洲国产精品yw在线观看 | 欧美日本一道本| 搞黄网站在线看| 日韩在线第一区| 国产成人av电影在线| 无码人妻av免费一区二区三区| 久久视频精品在线| 日韩精品导航| 国产成人强伦免费视频网站| 亚洲 欧美综合在线网络| 高h视频在线| 成人三级在线| 免费精品99久久国产综合精品| 免费一级a毛片夜夜看| 国产亚洲一区精品| 国产在线播放精品| 手机免费看av网站| 午夜精品123| 国产在线高清理伦片a| 欧美一区二区三区精美影视| 福利一区福利二区| 91福利免费视频| 日本欧美黄网站| 亚洲区第一页| av激情在线观看|