Go log庫(kù)的使用示例詳解
log庫(kù)簡(jiǎn)介
Go語(yǔ)言內(nèi)置的log包實(shí)現(xiàn)了簡(jiǎn)單的日志服務(wù)。本文介紹了標(biāo)準(zhǔn)庫(kù)log的基本使用。
使用Logger
log包定義了Logger類型,該類型提供了一些格式化輸出的方法。本包也提供了一個(gè)預(yù)定義的“標(biāo)準(zhǔn)”logger,可以通過(guò)調(diào)用函數(shù)Print系列(Print|Printf|Println)、Fatal系列(Fatal|Fatalf|Fatalln)、和Panic系列(Panic|Panicf|Panicln)來(lái)使用,比自行創(chuàng)建一個(gè)logger對(duì)象更容易使用。
例如,我們可以像下面的代碼一樣直接通過(guò)log包來(lái)調(diào)用上面提到的方法,默認(rèn)它們會(huì)將日志信息打印到終端界面:
package main
import (
"log"
)
func main() {
log.Println("這是一條很普通的日志。")
v := "很普通的"
log.Printf("這是一條%s日志。\n", v)
log.Fatalln("這是一條會(huì)觸發(fā)fatal的日志。")
log.Panicln("這是一條會(huì)觸發(fā)panic的日志。")
}編譯并執(zhí)行上面的代碼會(huì)得到如下輸出:
2017/06/19 14:04:17 這是一條很普通的日志。
2017/06/19 14:04:17 這是一條很普通的日志。
2017/06/19 14:04:17 這是一條會(huì)觸發(fā)fatal的日志。
logger會(huì)打印每條日志信息的日期、時(shí)間,默認(rèn)輸出到系統(tǒng)的標(biāo)準(zhǔn)錯(cuò)誤。Fatal系列函數(shù)會(huì)在寫(xiě)入日志信息后調(diào)用os.Exit(1)。Panic系列函數(shù)會(huì)在寫(xiě)入日志信息后panic。
配置logger
標(biāo)準(zhǔn)logger的配置
默認(rèn)情況下的logger只會(huì)提供日志的時(shí)間信息,但是很多情況下我們希望得到更多信息,比如記錄該日志的文件名和行號(hào)等。log標(biāo)準(zhǔn)庫(kù)中為我們提供了定制這些設(shè)置的方法。
log標(biāo)準(zhǔn)庫(kù)中的Flags函數(shù)會(huì)返回標(biāo)準(zhǔn)logger的輸出配置,而SetFlags函數(shù)用來(lái)設(shè)置標(biāo)準(zhǔn)logger的輸出配置。
func Flags() int func SetFlags(flag int)
flag選項(xiàng)
log標(biāo)準(zhǔn)庫(kù)提供了如下的flag選項(xiàng),它們是一系列定義好的常量。
const (
// 控制輸出日志信息的細(xì)節(jié),不能控制輸出的順序和格式。
// 輸出的日志在每一項(xiàng)后會(huì)有一個(gè)冒號(hào)分隔:例如2009/01/23 01:23:23.123123 /a/b/c/d.go:23: message
Ldate = 1 << iota // 日期:2009/01/23
Ltime // 時(shí)間:01:23:23
Lmicroseconds // 微秒級(jí)別的時(shí)間:01:23:23.123123(用于增強(qiáng)Ltime位)
Llongfile // 文件全路徑名+行號(hào): /a/b/c/d.go:23
Lshortfile // 文件名+行號(hào):d.go:23(會(huì)覆蓋掉Llongfile)
LUTC // 使用UTC時(shí)間
LstdFlags = Ldate | Ltime // 標(biāo)準(zhǔn)logger的初始值
)下面我們?cè)谟涗浫罩局跋仍O(shè)置一下標(biāo)準(zhǔn)logger的輸出選項(xiàng)如下:
func main() {
log.SetFlags(log.Llongfile | log.Lmicroseconds | log.Ldate)
log.Println("這是一條很普通的日志。")
}編譯執(zhí)行后得到的輸出結(jié)果如下:
2017/06/19 14:05:17.494943 .../log_demo/main.go:11: 這是一條很普通的日志。
配置日志前綴
log標(biāo)準(zhǔn)庫(kù)中還提供了關(guān)于日志信息前綴的兩個(gè)方法:
func Prefix() string func SetPrefix(prefix string)
其中Prefix函數(shù)用來(lái)查看標(biāo)準(zhǔn)logger的輸出前綴,SetPrefix函數(shù)用來(lái)設(shè)置輸出前綴。
func main() {
log.SetFlags(log.Llongfile | log.Lmicroseconds | log.Ldate)
log.Println("這是一條很普通的日志。")
log.SetPrefix("[knoci]")
log.Println("這是一條很普通的日志。")
}上面的代碼輸出如下:
[knoci]2017/06/19 14:05:57.940542 .../log_demo/main.go:13: 這是一條很普通的日志。
這樣我們就能夠在代碼中為我們的日志信息添加指定的前綴,方便之后對(duì)日志信息進(jìn)行檢索和處理。
配置日志輸出位置
func SetOutput(w io.Writer)
SetOutput函數(shù)用來(lái)設(shè)置標(biāo)準(zhǔn)logger的輸出目的地,默認(rèn)是標(biāo)準(zhǔn)錯(cuò)誤輸出。
例如,下面的代碼會(huì)把日志輸出到同目錄下的xx.log文件中。
func main() {
logFile, err := os.OpenFile("./xx.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
fmt.Println("open log file failed, err:", err)
return
}
log.SetOutput(logFile)
log.SetFlags(log.Llongfile | log.Lmicroseconds | log.Ldate)
log.Println("這是一條很普通的日志。")
log.SetPrefix("[knoci]")
log.Println("這是一條很普通的日志。")
} 如果你要使用標(biāo)準(zhǔn)的logger,我們通常會(huì)把上面的配置操作寫(xiě)到init函數(shù)中。
func init() {
logFile, err := os.OpenFile("./xx.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
fmt.Println("open log file failed, err:", err)
return
}
log.SetOutput(logFile)
log.SetFlags(log.Llongfile | log.Lmicroseconds | log.Ldate)
}創(chuàng)建logger
log標(biāo)準(zhǔn)庫(kù)中還提供了一個(gè)創(chuàng)建新logger對(duì)象的構(gòu)造函數(shù)–New,支持我們創(chuàng)建自己的logger示例。New函數(shù)的簽名如下:
func New(out io.Writer, prefix string, flag int) *Logger
New創(chuàng)建一個(gè)Logger對(duì)象。其中,參數(shù)out設(shè)置日志信息寫(xiě)入的目的地。參數(shù)prefix會(huì)添加到生成的每一條日志前面。參數(shù)flag定義日志的屬性(時(shí)間、文件等等)。
舉個(gè)例子:
func main() {
logger := log.New(os.Stdout, "<New>", log.Lshortfile|log.Ldate|log.Ltime)
logger.Println("這是自定義的logger記錄的日志。")
}將上面的代碼編譯執(zhí)行之后,得到結(jié)果如下:
<New>2017/06/19 14:06:51 main.go:34: 這是自定義的logger記錄的日志。
總結(jié)
Go內(nèi)置的log庫(kù)功能有限,例如無(wú)法滿足記錄不同級(jí)別日志的情況,我們?cè)趯?shí)際的項(xiàng)目中根據(jù)自己的需要選擇使用第三方的日志庫(kù),如logrus、zap等。
到此這篇關(guān)于Go log庫(kù)的使用的文章就介紹到這了,更多相關(guān)Go log庫(kù)使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- golang 日志log與logrus示例詳解
- go語(yǔ)言中的log 包示例詳解
- Go中l(wèi)og包異或組合配置妙用詳解
- Golang日志庫(kù)logrus的介紹與使用示例代碼
- Go標(biāo)準(zhǔn)庫(kù)Flag庫(kù)和Log庫(kù)的使用
- 源碼分析Golang?log是如何實(shí)現(xiàn)的
- Go?1.21.0?新增結(jié)構(gòu)化日志記錄標(biāo)準(zhǔn)庫(kù)log/slog使用詳解
- golang結(jié)構(gòu)化日志log/slog包之slog.Record的用法簡(jiǎn)介
- go中l(wèi)og包的實(shí)現(xiàn)示例
相關(guān)文章
golang通用的grpc?http基礎(chǔ)開(kāi)發(fā)框架使用快速入門
這篇文章主要為大家介紹了golang通用的grpc?http基礎(chǔ)開(kāi)發(fā)框架使用快速入門詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
go語(yǔ)言實(shí)現(xiàn)并發(fā)網(wǎng)絡(luò)爬蟲(chóng)的示例代碼
本文主要介紹了go語(yǔ)言實(shí)現(xiàn)并發(fā)網(wǎng)絡(luò)爬蟲(chóng)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
Go語(yǔ)言運(yùn)行環(huán)境安裝詳細(xì)教程
這篇文章主要介紹了Go語(yǔ)言運(yùn)行環(huán)境安裝詳細(xì)教程,本文講解了Linux、MAC OS、Windows下的安裝方法,同時(shí)講解了驗(yàn)證是否安裝成功、第三方工具安裝運(yùn)行環(huán)境的方法,需要的朋友可以參考下2014-10-10
Golang官方限流器time/rate的使用與實(shí)現(xiàn)詳解
限流器是后臺(tái)服務(wù)中十分重要的組件,在實(shí)際的業(yè)務(wù)場(chǎng)景中使用居多。time/rate?包基于令牌桶算法實(shí)現(xiàn)限流,本文主要為大家介紹了time/rate的使用與實(shí)現(xiàn),需要的可以參考一下2023-04-04
go?build失敗報(bào)方法undefined的解決過(guò)程
go build命令用于編譯我們指定的源碼文件或代碼包以及它們的依賴包,下面這篇文章主要給大家介紹了關(guān)于go?build失敗報(bào)方法undefined的解決過(guò)程,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11
剖析Go編寫(xiě)的Socket服務(wù)器模塊解耦及基礎(chǔ)模塊的設(shè)計(jì)
這篇文章主要介紹了Go的Socket服務(wù)器模塊解耦及日志和定時(shí)任務(wù)的模塊設(shè)計(jì),舉了一些Go語(yǔ)言編寫(xiě)的服務(wù)器模塊的例子,需要的朋友可以參考下2016-03-03
GO語(yǔ)言利用K近鄰算法實(shí)現(xiàn)小說(shuō)鑒黃
本文給大家分享的是一段GO語(yǔ)言利用K近鄰算法實(shí)現(xiàn)小說(shuō)鑒黃的方法,本方法的鑒別的關(guān)鍵是關(guān)鍵是向量點(diǎn)的選擇和閾值的判定,推薦給大家,有需要的小伙伴可以參考下。2015-03-03

