Go log庫的使用示例詳解
log庫簡介
Go語言內(nèi)置的log
包實現(xiàn)了簡單的日志服務(wù)。本文介紹了標(biāo)準(zhǔn)庫log
的基本使用。
使用Logger
log包定義了Logger類型,該類型提供了一些格式化輸出的方法。本包也提供了一個預(yù)定義的“標(biāo)準(zhǔn)”logger,可以通過調(diào)用函數(shù)Print系列
(Print|Printf|Println)、Fatal系列
(Fatal|Fatalf|Fatalln)、和Panic系列
(Panic|Panicf|Panicln)來使用,比自行創(chuàng)建一個logger對象更容易使用。
例如,我們可以像下面的代碼一樣直接通過log
包來調(diào)用上面提到的方法,默認(rèn)它們會將日志信息打印到終端界面:
package main import ( "log" ) func main() { log.Println("這是一條很普通的日志。") v := "很普通的" log.Printf("這是一條%s日志。\n", v) log.Fatalln("這是一條會觸發(fā)fatal的日志。") log.Panicln("這是一條會觸發(fā)panic的日志。") }
編譯并執(zhí)行上面的代碼會得到如下輸出:
2017/06/19 14:04:17 這是一條很普通的日志。
2017/06/19 14:04:17 這是一條很普通的日志。
2017/06/19 14:04:17 這是一條會觸發(fā)fatal的日志。
logger會打印每條日志信息的日期、時間,默認(rèn)輸出到系統(tǒng)的標(biāo)準(zhǔn)錯誤。Fatal系列函數(shù)會在寫入日志信息后調(diào)用os.Exit(1)。Panic系列函數(shù)會在寫入日志信息后panic。
配置logger
標(biāo)準(zhǔn)logger的配置
默認(rèn)情況下的logger只會提供日志的時間信息,但是很多情況下我們希望得到更多信息,比如記錄該日志的文件名和行號等。log
標(biāo)準(zhǔn)庫中為我們提供了定制這些設(shè)置的方法。
log
標(biāo)準(zhǔn)庫中的Flags
函數(shù)會返回標(biāo)準(zhǔn)logger的輸出配置,而SetFlags
函數(shù)用來設(shè)置標(biāo)準(zhǔn)logger的輸出配置。
func Flags() int func SetFlags(flag int)
flag選項
log
標(biāo)準(zhǔn)庫提供了如下的flag選項,它們是一系列定義好的常量。
const ( // 控制輸出日志信息的細(xì)節(jié),不能控制輸出的順序和格式。 // 輸出的日志在每一項后會有一個冒號分隔:例如2009/01/23 01:23:23.123123 /a/b/c/d.go:23: message Ldate = 1 << iota // 日期:2009/01/23 Ltime // 時間:01:23:23 Lmicroseconds // 微秒級別的時間:01:23:23.123123(用于增強(qiáng)Ltime位) Llongfile // 文件全路徑名+行號: /a/b/c/d.go:23 Lshortfile // 文件名+行號:d.go:23(會覆蓋掉Llongfile) LUTC // 使用UTC時間 LstdFlags = Ldate | Ltime // 標(biāo)準(zhǔn)logger的初始值 )
下面我們在記錄日志之前先設(shè)置一下標(biāo)準(zhǔn)logger的輸出選項如下:
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)庫中還提供了關(guān)于日志信息前綴的兩個方法:
func Prefix() string func SetPrefix(prefix string)
其中Prefix
函數(shù)用來查看標(biāo)準(zhǔn)logger的輸出前綴,SetPrefix
函數(shù)用來設(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: 這是一條很普通的日志。
這樣我們就能夠在代碼中為我們的日志信息添加指定的前綴,方便之后對日志信息進(jìn)行檢索和處理。
配置日志輸出位置
func SetOutput(w io.Writer)
SetOutput
函數(shù)用來設(shè)置標(biāo)準(zhǔn)logger的輸出目的地,默認(rèn)是標(biāo)準(zhǔn)錯誤輸出。
例如,下面的代碼會把日志輸出到同目錄下的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,我們通常會把上面的配置操作寫到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)庫中還提供了一個創(chuàng)建新logger對象的構(gòu)造函數(shù)–New
,支持我們創(chuàng)建自己的logger示例。New
函數(shù)的簽名如下:
func New(out io.Writer, prefix string, flag int) *Logger
New創(chuàng)建一個Logger對象。其中,參數(shù)out設(shè)置日志信息寫入的目的地。參數(shù)prefix會添加到生成的每一條日志前面。參數(shù)flag定義日志的屬性(時間、文件等等)。
舉個例子:
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庫功能有限,例如無法滿足記錄不同級別日志的情況,我們在實際的項目中根據(jù)自己的需要選擇使用第三方的日志庫,如logrus、zap等。
到此這篇關(guān)于Go log庫的使用的文章就介紹到這了,更多相關(guān)Go log庫使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang中的archive/zip包的常用函數(shù)詳解
Golang 中的 archive/zip 包用于處理 ZIP 格式的壓縮文件,提供了一系列用于創(chuàng)建、讀取和解壓縮 ZIP 格式文件的函數(shù)和類型,下面小編就來和大家講解下常用函數(shù)吧2023-08-08Go開發(fā)go-optioner工具實現(xiàn)輕松生成函數(shù)選項模式代碼
go-optioner?是一個在?Go?代碼中生成函數(shù)選項模式代碼的工具,可以根據(jù)給定的結(jié)構(gòu)定義自動生成相應(yīng)的選項代碼,下面就來聊聊go-optioner是如何使用的吧2023-07-07在Go中實現(xiàn)和使用堆棧以及先進(jìn)先出原則詳解
Go是一種功能強(qiáng)大的編程語言,提供了豐富的數(shù)據(jù)結(jié)構(gòu)和算法,堆棧是計算機(jī)科學(xué)中的基本數(shù)據(jù)結(jié)構(gòu)之一,在本博文中,我們將探討如何在?Go?中實現(xiàn)和使用堆棧,以及堆棧如何遵循先進(jìn)先出?(FIFO)?原則2023-10-10Golang回調(diào)函數(shù)與閉包和接口函數(shù)的定義及使用介紹
這篇文章主要介紹了Golang回調(diào)函數(shù)與閉包和接口函數(shù)的定義及使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-05-05Go語言實現(xiàn)多協(xié)程文件下載器的過程詳解
這篇文章主要介紹了Go語言實現(xiàn)多協(xié)程文件下載器的相關(guān)資料,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2024-08-08Golang中interface{}轉(zhuǎn)為數(shù)組的操作
這篇文章主要介紹了Golang中interface{}轉(zhuǎn)為數(shù)組的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04