亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Golang結(jié)構(gòu)化日志包log/slog的使用詳解

 更新時間:2023年09月08日 08:22:01   作者:路多辛  
官方提供的用于打印日志的包是標準庫中的 log 包,該包雖然被廣泛使用,但是缺點也很多,所以Go 1.21新增的 log/slog 完美解決了以上問題,下面我們就來看看log/slog包的使用吧

前言

在 Go 1.21以前,官方提供的用于打印日志的包是標準庫中的 log 包,該包雖然被廣泛使用,但是缺點也很多,Go 社區(qū)要求改進的聲音不斷,主要有以下缺點:

log 包只提供了基本的日志記錄功能,功能相對太過簡單,缺乏很多常用功能,例如日志級別控制、自定義日志格式等,這就導(dǎo)致在很多應(yīng)用程序中無法滿足日志處理的需求。

不能自定義輸出目標,log 包默認將日志輸出到標準錯誤(stderr)。如果需要將日志輸出到其他地方,例如文件、隊列或日志存儲系統(tǒng)等,就需要自己實現(xiàn)或者使用第三方日志包來滿足這些需求。

Go 1.21新增的 log/slog 完美解決了以上問題,并且?guī)砹撕芏嗥渌軐嵱玫奶匦浴?/p>

log/slog 包初體驗

log/slog 包提供結(jié)構(gòu)化的日志記錄功能,其中的日志記錄包括時間、日志級別、消息和以鍵值對表示的各種其他屬性。

log/slog 包定義了一個 Logger 結(jié)構(gòu)體,這個結(jié)構(gòu)體提供了幾個方法(如 Logger.Info、Logger.Warn、Logger.Error等)用于打印不同級別的日志。每個 Logger 都與一個 Handler 相關(guān)聯(lián),Logger 的打印日志方法根據(jù)參數(shù)創(chuàng)建一條日志并傳遞給 Handler,由 Handler 來決定如何處理這條日志。log/slog 包提供的打印日志的函數(shù)例如 Info、Warn、Error 等,是通過調(diào)用默認 Logger 中的相關(guān)方法來實現(xiàn)的。

日志記錄由時間、級別、消息和一組鍵值對組成,其中鍵是字符串,值可以是任何類型。看個簡單的示例:

package main
import (
    "log/slog"
)
func main() {
    slog.Info("hello", "count", 3)
}

使用 slog.Info 函數(shù)創(chuàng)建了一條記錄,包括打印時間、日志級別 Info、消息為“hello”和一個鍵為“count”值為 3 的鍵值對。運行結(jié)果如下:

2023/09/07 22:00:33 INFO hello count=3

Info 函數(shù)是通過調(diào)用默認 Logger 的 相關(guān)方法實現(xiàn)的,看一下 Info 函數(shù)的定義:

// Info calls Logger.Info on the default logger.
func Info(msg string, args ...any) {
    Default().log(context.Background(), LevelInfo, msg, args...)
}

可以看出調(diào)用了使用 Default 函數(shù)返回的 Logger 對象中的 log 方法實現(xiàn)的,Default 函數(shù)的定義如下:

func Default() *Logger { return defaultLogger.Load().(*Logger) }

defaultLogger 是 atomic.Value 類型,存儲了默認的 Logger 類型,這個默認的 Logger 類型是通過 init 函數(shù)存儲進去的,init 函數(shù)的定義如下:

func ?() {
    defaultLogger.Store(New(newDefaultHandler(loginternal.DefaultOutput)))
}

默認的 Logger 打印日志的函數(shù)還有 Debug、Warn 和 Error。除了這幾個很方便使用的函數(shù)外,還有一個 Log 函數(shù),可以接受一個日志級別參數(shù)??磦€簡單的示例:

package main
import (
    "context"
    "log/slog"
)
func main() {
    slog.Log(context.Background(), slog.LevelInfo, "hello", "count", 3)
}

運行看下效果:

2023/09/07 22:09:58 INFO hello count=3、

可以看出和 直接調(diào)用 Info 函數(shù)效果是一樣的。

Logger 類型

看下 Logger 類型的定義,如下:

type Logger struct {
    handler Handler // for structured logging
}

提供了 Log、Debug、Info、Warn 和 Error 這幾個打印日志的方法。

到此這篇關(guān)于Golang結(jié)構(gòu)化日志包log/slog的使用詳解的文章就介紹到這了,更多相關(guān)go log/slog包內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論