欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

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

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

Go 1.21新增的 log/slog 完美解決了以上問題,并且?guī)砹撕芏嗥渌軐?shí)用的特性。

log/slog 包初體驗(yàn)

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

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)用默認(rèn) Logger 中的相關(guān)方法來實(shí)現(xiàn)的。

日志記錄由時(shí)間、級別、消息和一組鍵值對組成,其中鍵是字符串,值可以是任何類型??磦€簡單的示例:

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

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

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

Info 函數(shù)是通過調(diào)用默認(rèn) Logger 的 相關(guān)方法實(shí)現(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 方法實(shí)現(xiàn)的,Default 函數(shù)的定義如下:

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

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

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

默認(rèn)的 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)
}

運(yùn)行看下效果:

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)文章

  • 使用Go語言自制簡單易用的Web框架

    使用Go語言自制簡單易用的Web框架

    這篇文章主要為大家詳細(xì)介紹了如何使用Go語言實(shí)現(xiàn)自制簡單易用的Web框架,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • Go?處理大數(shù)組使用?for?range?和?for?循環(huán)的區(qū)別

    Go?處理大數(shù)組使用?for?range?和?for?循環(huán)的區(qū)別

    這篇文章主要介紹了Go處理大數(shù)組使用for?range和for循環(huán)的區(qū)別,對于遍歷大數(shù)組而言,for循環(huán)能比for?range循環(huán)更高效與穩(wěn)定,這一點(diǎn)在數(shù)組元素為結(jié)構(gòu)體類型更加明顯,下文具體分析感興趣得小伙伴可以參考一下
    2022-05-05
  • 深入淺出Golang中的sync.Pool

    深入淺出Golang中的sync.Pool

    sync.Pool是可伸縮的,也是并發(fā)安全的,其大小僅受限于內(nèi)存大小。本文主要為大家介紹一下Golang中sync.Pool的原理與使用,感興趣的小伙伴可以了解一下
    2023-03-03
  • 解析GOROOT、GOPATH、Go-Modules-三者的關(guān)系

    解析GOROOT、GOPATH、Go-Modules-三者的關(guān)系

    這篇文章主要介紹了解析GOROOT、GOPATH、Go-Modules-三者的關(guān)系,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 一文詳解Golang使用接口支持Apply方法的配置模式

    一文詳解Golang使用接口支持Apply方法的配置模式

    這篇文章主要為大家介紹了一文詳解Golang使用接口支持Apply方法的配置模式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • golang實(shí)現(xiàn)http服務(wù)器處理靜態(tài)文件示例

    golang實(shí)現(xiàn)http服務(wù)器處理靜態(tài)文件示例

    這篇文章主要介紹了golang實(shí)現(xiàn)http服務(wù)器處理靜態(tài)文件的方法,涉及Go語言基于http協(xié)議處理文件的相關(guān)技巧,需要的朋友可以參考下
    2016-07-07
  • 利用go語言編寫一個并發(fā)包

    利用go語言編寫一個并發(fā)包

    這篇文章主要為大家詳細(xì)介紹了如何利用go語言編寫一個并發(fā)包,適合大部分并發(fā)任務(wù),開箱即用,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考下
    2023-10-10
  • Go語言開發(fā)技巧必知的小細(xì)節(jié)提升效率

    Go語言開發(fā)技巧必知的小細(xì)節(jié)提升效率

    這篇文章主要介紹了Go語言開發(fā)技巧必知的小細(xì)節(jié)提升效率,分享幾個你可能不知道的Go語言小細(xì)節(jié),希望能幫助大家更好地學(xué)習(xí)這門語言
    2024-01-01
  • 詳解golang避免循環(huán)import問題(“import cycle not allowed”)

    詳解golang避免循環(huán)import問題(“import cycle not allowed”)

    這篇文章主要給大家介紹了關(guān)于golang中不允許循環(huán)import問題("import cycle not allowed")的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • Go語言使用protojson庫實(shí)現(xiàn)Protocol Buffers與JSON轉(zhuǎn)換

    Go語言使用protojson庫實(shí)現(xiàn)Protocol Buffers與JSON轉(zhuǎn)換

    本文主要介紹Google開源的工具庫Protojson庫如何Protocol Buffers與JSON進(jìn)行轉(zhuǎn)換,以及和標(biāo)準(zhǔn)庫encoding/json的性能對比,需要的朋友可以參考下
    2023-09-09

最新評論