golang標(biāo)準(zhǔn)庫log包的學(xué)習(xí)使用
一 log簡介
golang內(nèi)置了log包,實(shí)現(xiàn)簡單的日志服務(wù)。通過調(diào)用log包的函數(shù),可以實(shí)現(xiàn)簡單的日志打印功能。
log包定義了Logger類型,該類型提供了一些格式化輸出的方法。本包也提供了一個(gè)預(yù)定義的“標(biāo)準(zhǔn)”logger,可以通過調(diào)用函數(shù)Print系列(Print|Printf|Println)、Fatal系列(Fatal|Fatalf|Fatalln)、和Panic系列(Panic|Panicf|Panicln)來使用,比自行創(chuàng)建一個(gè)logger對象更容易使用,它們會(huì)將日志信息打印到終端界面
二 log簡單使用
log包中有3個(gè)系列的日志打印函數(shù),分別print系列、panic系列、fatal系列.
| 函數(shù)系列 | 說明 | 作用 |
|---|---|---|
| Print/Printf/Println | 單純打印日志 | |
| Panic | Panic/Panicf/Panicln | 打印日志,拋出panic異常 |
| Fatal | Fatal/Fatalf/Fatalln | 打印日志,強(qiáng)制結(jié)束程序(os.Exit(1)),defer函數(shù)不會(huì)執(zhí)行 |
log包主要提供了3類接口,分別是print系列、panic系列、fatal系列,對每一類接口其提供了3種調(diào)用方式,分別是“Xxxx、Xxxxln、Xxxxf”,基本與fmt中的相關(guān)函數(shù)類似。
2.1 log.Print/Println/Printf函數(shù)
log.Print/Println/Printf函數(shù)只是單純打印日志
實(shí)例演示:
package main
import "log"
func main() {
log.Print("my log")
log.Printf("my log %d", 100) // 格式化輸出
name := "tom"
age := 20
log.Println(name, " ", age)
}
運(yùn)行結(jié)果:
[Running] go run "c:\Users\Mechrevo\Desktop\go_pro\test.go"
2022/07/12 17:27:16 my log
2022/07/12 17:27:16 my log 100
2022/07/12 17:27:16 tom 20[Done] exited with code=0 in 1.118 seconds
基本使用與fmt中的函數(shù)類似
2.2 log.Panic/Panicf/Panicln函數(shù)
log.Panic/Panicf/Panicln函數(shù)會(huì)打印出日志并且拋出panic異常,需要注意的是在panic之后聲明的代碼將不會(huì)執(zhí)行。
實(shí)例演示:
package main
import (
"fmt"
"log"
)
func main() {
defer fmt.Println("發(fā)生了 panic錯(cuò)誤!")
log.Print("my log")
log.Panic("my panic")
fmt.Println("運(yùn)行結(jié)束。。。")
}
運(yùn)行結(jié)果:
[Running] go run "c:\Users\Mechrevo\Desktop\go_pro\test.go"
2022/07/12 17:31:48 my log
2022/07/12 17:31:48 my panic
發(fā)生了 panic錯(cuò)誤!
panic: my panicgoroutine 1 [running]:
log.Panic({0xc00007ff30?, 0x60?, 0x6e7be0?})
c:/go/src/log/log.go:385 +0x65
main.main()
c:/Users/Mechrevo/Desktop/go_pro/test.go:11 +0xc5
exit status 2[Done] exited with code=1 in 1.013 seconds
可見輸出了log.Print和log.Panic中的內(nèi)容,然后再panic之前的defer函數(shù)被調(diào)用并輸出,而log.Panic之后的fmt.Println并沒有被調(diào)用輸出,可見log.Panic拋出panic異常之后的代碼是不會(huì)被調(diào)用的。
log.Panicf/Panicln用法與2.1中的Println/Printf函數(shù)類似,此處不再贅述。
2.3 log.Fatal/Fatalf/Fatalln函數(shù)
對于log.Fatal接口,會(huì)將日志內(nèi)容打印輸出,接著調(diào)用系統(tǒng)的os.Exit(1)接口,強(qiáng)制退出程序并返回狀態(tài)1,但是有一點(diǎn)需要注意的是,由于直接調(diào)用系統(tǒng)os接口退出,defer函數(shù)不會(huì)調(diào)用。
實(shí)例演示:
package main
import (
"fmt"
"log"
)
func main() {
defer fmt.Println("defer。。。")
log.Print("my log")
log.Fatal("my fatal")
fmt.Println("運(yùn)行結(jié)束。。。")
}
運(yùn)行結(jié)果:
[Running] go run "c:\Users\Mechrevo\Desktop\go_pro\test.go"
2022/07/12 17:40:04 my log
2022/07/12 17:40:04 my fatal
exit status 1[Done] exited with code=1 in 0.975 seconds
可見并沒有調(diào)用defer函數(shù)。
log.Fatalf/Fatalln用法與2.1中的Println/Printf函數(shù)類似,此處不再贅述。
三 標(biāo)準(zhǔn)日志配置
默認(rèn)情況下log只會(huì)打印出時(shí)間,但是實(shí)際情況下我們還需要獲取文件名,行號(hào)等信息,log包提供給我們定制的接口。
log包提供兩個(gè)標(biāo)準(zhǔn)log配置的相關(guān)方法:
| 方法 | 說明 |
|---|---|
| func Flags() int | 返回標(biāo)準(zhǔn)log輸出配置 |
| func SetFlags(flag int) | 設(shè)置標(biāo)準(zhǔn)log輸出配置 |
3.1 flag參數(shù)
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的初始值
)
3.2 標(biāo)準(zhǔn)日志配置示例
package main
import (
"fmt"
"log"
)
func main() {
i := log.Flags()
fmt.Printf("i: %v\n", i)
log.SetFlags(log.Ldate | log.Ltime | log.Llongfile)
log.Print("my log")
}
運(yùn)行結(jié)果:
[Running] go run "c:\Users\Mechrevo\Desktop\go_pro\test.go"
i: 3
2022/07/12 17:59:29 c:/Users/Mechrevo/Desktop/go_pro/test.go:12: my log[Done] exited with code=0 in 1.102 seconds
四 日志前綴配置
log包提供兩個(gè)日志前綴配置的相關(guān)函數(shù):
| 方法 | 說明 |
|---|---|
| func Prefix() string | 返回日志的前綴配置 |
| func SetPrefix(prefix string) | 設(shè)置日志前綴 |
實(shí)例演示:
package main
import (
"fmt"
"log"
)
func main() {
s := log.Prefix()
fmt.Printf("s: %v\n", s)
log.SetPrefix("[MyLog] ")
s = log.Prefix()
fmt.Printf("s: %v\n", s)
log.Print("my log...")
}
運(yùn)行結(jié)果:
[Running] go run "c:\Users\Mechrevo\Desktop\go_pro\test.go"
s:
s: [MyLog]
[MyLog] 2022/07/12 18:00:55 my log...[Done] exited with code=0 in 0.977 seconds
五 日志輸出位置配置
前面介紹的都是將日志輸出到控制臺(tái)上,golang的log包還支持將日志輸出到文件中,log包提供了func SetOutput(w io.Writer)函數(shù),將日志輸出到文件中。
實(shí)例演示:
package main
import (
"log"
"os"
)
func main() {
f, err := os.OpenFile("a.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
log.Panic("打開日志文件異常")
}
log.SetOutput(f)
log.Print("my log...")
}
運(yùn)行結(jié)果:
日志輸出到當(dāng)前目錄下 a.log文件中
2022/07/12 18:02:20 my log...
六 自定義logger
log包中提供了func New(out io.Writer, prefix string, flag int) *Logger函數(shù)來實(shí)現(xiàn)自定義logger。從效果上來看,就是標(biāo)準(zhǔn)日志配置、日志前綴配置、日志輸出位置配置整合到一個(gè)函數(shù)中,使日志配置不在那么繁瑣。
實(shí)例演示:
package main
import (
"log"
"os"
)
var logger *log.Logger
func init() {
logFile, err := os.OpenFile("a.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
log.Panic("打開日志文件異常")
}
logger = log.New(logFile, "[Mylog]", log.Ldate|log.Ltime|log.Lshortfile)
}
func main() {
logger.Println("自定義logger")
}
運(yùn)行結(jié)果:
日志輸出到當(dāng)前目錄下 a.log文件中
[Mylog]2022/07/12 18:06:21 test.go:19: 自定義logge
到此這篇關(guān)于golang標(biāo)準(zhǔn)庫log包的學(xué)習(xí)使用的文章就介紹到這了,更多相關(guān)golang標(biāo)準(zhǔn)庫log包內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang中的new()和make()函數(shù)本質(zhì)區(qū)別
在 Go 語言開發(fā)中,new() 和 make() 是兩個(gè)容易讓開發(fā)者感到困惑的內(nèi)建函數(shù),盡管它們都用于內(nèi)存分配,但其設(shè)計(jì)目的、適用場景和底層實(shí)現(xiàn)存在本質(zhì)差異,本文將通過類型系統(tǒng)、內(nèi)存模型和編譯器實(shí)現(xiàn)三個(gè)維度,深入解析這兩個(gè)函數(shù)的本質(zhì)區(qū)別,感興趣的朋友一起看看吧2025-02-02
Golang 錯(cuò)誤捕獲Panic與Recover的使用
對于Go語言的錯(cuò)誤是通過返回值的方式,本文主要介紹了Golang 錯(cuò)誤捕獲Panic與Recover的使用,文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
GoZero中make后返回?cái)?shù)據(jù)與原數(shù)據(jù)不對齊的幾種解決方案
在Go語言中,make是用來創(chuàng)建切片、映射(map)和通道(channel)的內(nèi)建函數(shù),但是,在使用 make 創(chuàng)建切片時(shí),若不理解如何正確使用其返回值,可能會(huì)遇到數(shù)據(jù)對不上或結(jié)果不符合預(yù)期的情況,本文將分析在GoZero或其他基于Go的應(yīng)用中,使用make時(shí)可能導(dǎo)致的問題及解決方案2025-01-01
Golang?urfave/cli庫簡單應(yīng)用示例詳解
這篇文章主要為大家介紹了Golang?urfave/cli庫簡單應(yīng)用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
深入淺出Go:掌握基礎(chǔ)知識(shí)的關(guān)鍵要點(diǎn)
Go是一種開源的編程語言,由Google開發(fā),它具有簡潔、高效、并發(fā)性強(qiáng)的特點(diǎn),適用于構(gòu)建可靠的、高性能的軟件系統(tǒng),本文將介紹Go的基礎(chǔ)知識(shí),需要的朋友可以參考下2023-10-10
基于Golang實(shí)現(xiàn)延遲隊(duì)列(DelayQueue)
延遲隊(duì)列是一種特殊的隊(duì)列,元素入隊(duì)時(shí)需要指定到期時(shí)間(或延遲時(shí)間),從隊(duì)頭出隊(duì)的元素必須是已經(jīng)到期的。本文將用Golang實(shí)現(xiàn)延遲隊(duì)列,感興趣的可以了解下2022-09-09

