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

go1.21中slog日志包用法入門

 更新時間:2023年09月12日 08:33:35   作者:青峰上人  
go1.21中,slog這一被Go語言團隊精心設計的結構化日志包正式落地,本文將帶領讀者上手slog,體會其與傳統(tǒng)log的差異,感興趣的小伙伴快跟隨小編一起學習一下吧

WHY

在日志處理上,我們從前使用的log包缺乏結構化的輸出,導致信息呈現(xiàn)出來的樣子并非最適合人類閱讀,而slog是一種結構化的日志,它可以用鍵值對的形式將我們需要的信息呈現(xiàn)出來,使得處理與分析日志變得更為容易。

HOW

1. 快速入門

package main
import (
	"log/slog"
)
func main() {
	slog.Info("my first slog msg", "greeting", "hello, slog")
	slog.Error("my secod slog message", "greeting", "hello slog")
	slog.Warn("my third message", "greeting", "hello slog")
}

以上是三條最簡單的slog語句,其結果是這樣的:

2023/09/10 21:51:03 INFO my first slog msg greeting="hello, slog"
2023/09/10 21:51:03 ERROR my secod slog message greeting="hello slog"
2023/09/10 21:51:03 WARN my third message greeting="hello slog"

這三行代碼中的第一個參數(shù)代表了log的message,我們可以看到,此時打印出來的日志信息是文本信息,那如何使得日志以非純文本(比如json)展現(xiàn)呢?

2. TextHandler和JSONHandler

當我們想要日志以key-value格式呈現(xiàn)時,我們可以用下面這種方式:

h := slog.NewTextHandler(os.Stderr, nil)
	l := slog.New(h)
	l.Info("greeting", "name", "xxx")

最終結果:

time=2023-09-10T21:58:34.144+08:00 level=INFO msg=greeting name=xxx

當我們想要日志以json格式呈現(xiàn)時,我們可以使用下面這種方式:

h1 := slog.NewJSONHandler(os.Stderr, nil)
	l1 := slog.New(h1)
	l1.Info("greeting", "name", "xxx")

最終結果:

{"time":"2023-09-10T22:00:04.687003+08:00","level":"INFO","msg":"greeting","name":"xxx"}

slog.NewJSONHandler函數(shù)和slog.NewTextHandler函數(shù)都會返回一個JsonHandler結構體或是TextHandler的引用,這個結構體會被slog.new函數(shù)接受,該函數(shù)返回一個Logger結構體的引用,這個logger結構體包含Handler接口,擁有一系列日志相關函數(shù),是我們最終打印日志的地方

func NewJSONHandler(w io.Writer, opts *HandlerOptions) *JSONHandler {}
func NewTextHandler(w io.Writer, opts *HandlerOptions) *TextHandler {}
func New(h Handler) *Logger {}
type Logger struct {
	handler Handler // for structured logging
}
type Handler interface {}

如此,我們實現(xiàn)了基本的日志結構化輸出。

3.日志配置

我們通過對slog.HandlerOptions配置,可以實現(xiàn)例如 是否輸出日志來源 等設置;

s := &slog.HandlerOptions{
		AddSource: true,
	}
	slog.SetDefault(slog.New(slog.NewTextHandler(os.Stderr, s)))
	slog.Info("Test", "greeting", "hello, world")

此處筆者將該s設置為default情況,這樣直接使用slog.info就可以用到之前的配置;

最終結果:

time=2023-09-10T22:11:04.432+08:00 level=INFO source="/Users/wurenyu/Library/Mobile Documents/com~apple~CloudDocs/Go_learn/basic/slog/t1.go:13" msg=Test greeting="hello, world"

可以看到,由于AddSource被設置為true,我們的輸出日志中多了source這一信息;

又由于NewTextHandler,所以日志是以鍵值對的形式輸出的。

再來看這一段代碼:

opts := slog.HandlerOptions{
AddSource: true,
Level:     slog.LevelError,
}
slog.SetDefault(slog.New(slog.NewJSONHandler(os.Stderr, &opts)))
slog.Info("open file for reading", "name", "foo.txt", "path", "/home/tonybai/demo/foo.txt")
slog.Error("open file error", "err", os.ErrNotExist, "status", 2)

在slog配置中將Level設置為了LevelError,如此,將只能使用slog.error這一級別;

最終輸出結果:

{"time":"2023-09-10T22:13:44.493714+08:00","level":"ERROR","source":{"function":"main.main","file":"/Users/wurenyu/Library/Mobile Documents/com~apple~CloudDocs/Go_learn/basic/slog/t1.go","line":16},"msg":"open file error","err":"file does not exist","status":2}

4. Group形式輸出日志

baseLogger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
	groupedLogger := baseLogger.WithGroup("TTT")
	// Log with the grouped logger
	groupedLogger.Info("This log entry includes module information.", "test1", "answer1")
	groupedLogger.Warn("This log entry also includes module information.", "test2", "answer2")

上述代碼首先生成一個叫做baseLogger的logger,然后在這個logger上調(diào)用方法WithGroup,并傳入?yún)?shù)“TTT”,后面兩行分別輸出info和warn級別的日志;

最終結果如下:

{"time":"2023-09-10T22:23:28.527786+08:00","level":"INFO","msg":"This log entry includes module information.","TTT":{"test1":"answer1"}}
{"time":"2023-09-10T22:23:28.528019+08:00","level":"WARN","msg":"This log entry also includes module information.","TTT":{"test2":"answer2"}}

可以看到,在groupLogger后面加上的鍵值對都被加在了TTT后面;

不過值得關注的是,slog是支持給logger自定義字段的,給一個logger加上一個屬性之后,每次用這個logger輸出日志,都會輸出這個屬性對應的鍵值對,而這個信息不會被包含在WithGroup函數(shù)傳入的參數(shù)后面。

風格

個人認為一般不需要在msg中直接傳入代碼中的數(shù)據(jù),msg中應該盡量直接使用constant常量,這樣更可控。

WHAT

以下是slog大致的架構:

全文終。

以上就是go1.21中slog日志包用法入門的詳細內(nèi)容,更多關于go slog的資料請關注腳本之家其它相關文章!

相關文章

  • GO語言導入自己寫的包(同級目錄和不同目錄)

    GO語言導入自己寫的包(同級目錄和不同目錄)

    本文介紹了如何在Go語言項目中導入同級目錄和不同目錄的包,詳細解釋了創(chuàng)建文件結構、編寫主函數(shù)、同級目錄和不同目錄方法的調(diào)用,適合初學者參考,幫助理解Go項目的基本構建和包管理
    2024-09-09
  • 解讀golang plugin熱更新嘗試

    解讀golang plugin熱更新嘗試

    這篇文章主要介紹了解讀golang plugin熱更新嘗試,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • 詳解go語言中type關鍵詞的幾種使用

    詳解go語言中type關鍵詞的幾種使用

    這篇文章主要介紹了詳解go語言中type的幾種使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • golang gorm 操作mysql及gorm基本用法

    golang gorm 操作mysql及gorm基本用法

    golang 官方的那個操作mysql的有點麻煩所以就使用了gorm,下面就gorm的使用做下簡單介紹,感興趣的朋友跟隨小編一起看看吧
    2018-11-11
  • Go語言RPC Authorization進行簡單ip安全驗證的方法

    Go語言RPC Authorization進行簡單ip安全驗證的方法

    這篇文章主要介紹了Go語言RPC Authorization進行簡單ip安全驗證的方法,實例分析了Go語言進行ip驗證的技巧,需要的朋友可以參考下
    2015-03-03
  • golang中defer的關鍵特性示例詳解

    golang中defer的關鍵特性示例詳解

    defer是golang語言中的關鍵字,用于資源的釋放,會在函數(shù)返回之前進行調(diào)用。下面這篇文章主要給大家介紹了關于golang中defer的關鍵特性,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-08-08
  • Go語言里的new函數(shù)用法分析

    Go語言里的new函數(shù)用法分析

    這篇文章主要介紹了Go語言里的new函數(shù)用法,實例分析了new函數(shù)的功能及使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • Golang多個域名的跨域資源共享的實現(xiàn)

    Golang多個域名的跨域資源共享的實現(xiàn)

    本文主要介紹了Golang多個域名的跨域資源共享的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-02-02
  • 一文詳細介紹golang中.()類型斷言的使用方法

    一文詳細介紹golang中.()類型斷言的使用方法

    Golang是一門非常流行的編程語言,在很多領域都有著廣泛的應用,在開發(fā)過程中,很多時候我們需要將函數(shù)作為參數(shù)傳遞給其他函數(shù),這時候就需要用到golang中的.()用法,本文將詳細介紹golang中.()的使用方法,需要的朋友可以參考下
    2023-08-08
  • golang實現(xiàn)多協(xié)程下載文件(支持斷點續(xù)傳)

    golang實現(xiàn)多協(xié)程下載文件(支持斷點續(xù)傳)

    本文主要介紹了golang實現(xiàn)多協(xié)程下載文件,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11

最新評論