共計 3624 個字符,預(yù)計需要花費 10 分鐘才能閱讀完成。
這篇文章給大家介紹 Go 語言標準庫中的 log 該如何理解,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
Go 語言標準庫中的 log 介紹
1.log
1.1 使用 Logger
log 包定義了 Logger 類型,該類型提供了一些格式化輸出的方法。
本包也提供了一個預(yù)定義的 標準 logger, 可以通過調(diào)用 Print 系列(Print|Printf|Println)、Fatal 系列(Fatal|Fatalf|fatalln)和 Panic 系列(Panic|Panicf|PanicLn)來使用,比自行創(chuàng)建一個 logger 對象更容易使用。
例如:我們可以像下面的代碼一樣,直接通過 log 包來調(diào)用上岸提到的方法,默認它們會把日志信息大隱刀終端界面。
package mainimport ( log)func main() { log.Println( 這是一條很普通的日志。) v := 很普通的 log.Printf(這是一條 %s 日志。\n , v) log.Fatalln(這是一條會觸發(fā) fatal 的日志。) log.Panicln(這是一條會觸發(fā) panic 的日志。)}結(jié)果:2020/02/06 21:57:13 這是一條很普通的日志。2020/02/06 21:57:13 這是一條很普通的日志。2020/02/06 21:57:13 這是一條會觸發(fā) fatal 的日志。Process finished with exit code 1
logger 會打印每條日志信息的日期、時間,默認輸出到系統(tǒng)的標準錯誤。
Fatal 系列函數(shù)會寫入日志信息后調(diào)用 os.Exit(1)。
Panic 系列函數(shù)會在寫入日志信息后 panic。
1.2 配置 logger
1.2.1 標準 logger 的配置
默認情況下的 logger 只會提供日志的時間信息,但是很多情況下,我們希望得到更多信息,比如記錄該日志的文件名和行號等。
log 標準庫中為我們提供了定制這些設(shè)置的方法。
log 標準庫中的 Flags 函數(shù)會返回標準 logger 的輸出配置,而 SetFlags 函數(shù)是用來設(shè)置標準 logger 的輸出配置。
func Flags() int
func SetFlags(flag int)
flag 選項
log 標準庫提供了如下的 flag 選項,它們是一系列定義好的常量。
const (
// 控制輸出日志信息的細節(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(用于增強 Ltime 位)
Llongfile // 文件全路徑名 + 行號:/a/b/c/d.go:23
Lshortfile // 文件名 + 行號:d.go:23(會覆蓋掉 Llongfile)
LUTC // 使用 UTC 時間
LstdFlags = Ldate | Ltime // 標準 logger 的初始值
)
package mainimport ( log)func main() { // 設(shè)置 logger log.SetFlags(log.Llongfile | log.Lmicroseconds | log.Ldate) log.Println(這是一條很普通的日志。)}結(jié)果:2020/02/06 22:20:40.508109 /Users/tongchao/Desktop/gopath/src/test/test.go:10: 這是一條很普通的日志。Process finished with exit code 0
1.2.2 配置日志前綴
log 標準庫中還提供了關(guān)于日志信息前綴的兩個方法:
func Prefix() string // 查看標準 logger 的輸出前綴
func SetPrefix(prefix string) // 設(shè)置輸出前綴
package mainimport ( log)func main() { // 設(shè)置 logger log.SetFlags(log.Llongfile | log.Lmicroseconds | log.Ldate) log.Println(這是一條很普通的日志。) log.SetPrefix([前綴信息] ) log.Println(這是一條很普通的日志。)}結(jié)果:2020/02/06 22:25:27.654416 /Users/tongchao/Desktop/gopath/src/test/test.go:10: 這是一條很普通的日志。[前綴信息]2020/02/06 22:25:27.654601 /Users/tongchao/Desktop/gopath/src/test/test.go:12: 這是一條很普通的日志。Process finished with exit code 0
這樣可以在日志信息中添加指定的前綴,方便之后對日志信息進行檢索和處理。
1.2.3 配置日志輸出位置
func SetOutput(w io.Writer)
setOutput 函數(shù)用來設(shè)置標準 logger 的輸出目的地,默認是標準錯誤輸出。
把日志輸出到同目錄下的 xx.log 文件中。
package mainimport ( fmt log os)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([前綴信息] ) log.Println(這是一條很普通的日志。)}
結(jié)果:
xx.log 中內(nèi)容為
2020/02/06 22:30:22.369892 /Users/tongchao/Desktop/gopath/src/test/test.go:17: 這是一條很普通的日志。
[前綴信息]2020/02/06 22:30:22.370229 /Users/tongchao/Desktop/gopath/src/test/test.go:19: 這是一條很普通的日志。
如果要使用標準的 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)}
1.3 創(chuàng)建 logger
log 標準庫中還提供了創(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 定義日志的屬性(時間、文件等等)。
package mainimport ( log os)func main() { logger := log.New(os.Stdout, New , log.Lshortfile|log.Ldate|log.Ltime) logger.Println(這是自定義的 logger 記錄的日志。)}
結(jié)果:
New 2020/02/06 22:34:17 test.go:10: 這是自定義的 logger 記錄的日志。
Process finished with exit code 0
Go 內(nèi)置的 log 庫功能有限,不能滿足不同級別日志的情況,我們在實際的項目中根據(jù)自己的需要選擇第三方日志庫,如 logrus–https://github.com/sirupsen/logrus,zap–https://github.com/uber-go/zap 等
關(guān)于 Go 語言標準庫中的 log 該如何理解就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。