日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Go 淺析主流日志庫:從設計層學習如何集成日志輪轉與切割功能

來源: 責編: 時間:2023-11-28 09:32:24 218觀看
導讀前言在現有的日志庫中,包括 go 1.21.0 引入的 slog 日志庫,它們通常都支持對日志文件進行輪轉與切割,只不過這些功能并不直接被內置,而是需要我們主動配置來啟用。本文將探討幾個熱門的日志庫如 logrus、zap 和官網的 slo

前言

在現有的日志庫中,包括 go 1.21.0 引入的 slog 日志庫,它們通常都支持對日志文件進行輪轉與切割,只不過這些功能并不直接被內置,而是需要我們主動配置來啟用。cbG28資訊網——每日最新資訊28at.com

本文將探討幾個熱門的日志庫如 logrus、zap 和官網的 slog,我將分析這些庫的的關鍵設計元素,探討它們是如何支持日志輪轉與切割功能的配置。cbG28資訊網——每日最新資訊28at.com

準備好了嗎?準備一杯你最喜歡的咖啡或茶,隨著本文一探究竟吧。cbG28資訊網——每日最新資訊28at.com

前段時間發布了一篇 Go slog 包:開啟結構化日志的奇妙之旅 文章,有一位網友問我該日志庫是否支持日志輪轉與切割功能,此文章也算是解答他的一個疑惑。cbG28資訊網——每日最新資訊28at.com

圖片圖片cbG28資訊網——每日最新資訊28at.com

淺析 logrus、zap 和 slog 的設計

在對 logrus、zap 和 slog 這幾個日志庫的設計進行對比分析時,一個顯著的共同點是它們都包含了 io.Writer 這個關鍵的屬性。這一屬性在日志框架設計中起著核心作用,它決定了日志輸出的目標位置。cbG28資訊網——每日最新資訊28at.com

logrus 日志庫

logrus 是一個功能豐富的Go語言日志庫,它提供了結構化日志記錄、日志級別控制等功能。cbG28資訊網——每日最新資訊28at.com

當使用 logrus 時,可以調用 logrus.New() 函數來創建 Logger 實例。通過該實例我們執行很多操作,例如自定義日志輸出的位置和打印日志等。我們看看下面的代碼:cbG28資訊網——每日最新資訊28at.com

logger := logrus.New()logger.Out = os.Stdout // 標準輸出// 或者定向到文件//out, err := os.OpenFile("file.log", os.O_CREATE|os.O_WRONLY, 0666)//if err != nil {//	panic(err)//}//logger.Out = out

Logger 結構體的定義如下所示:cbG28資訊網——每日最新資訊28at.com

type Logger struct {	Out io.Writer	Hooks LevelHooks	Formatter Formatter    // 其他字段...}

關鍵屬性 Out,其類型為 io.Writer,這一屬性用于指定日志的輸出目標,無論是標準輸出、文件,還是其他自定義的輸出載體。cbG28資訊網——每日最新資訊28at.com

zap 日志庫

zap 是一個性能極高的日志庫。它提供了結構化日志記錄、多級別日志控制,以及靈活的配置選項。cbG28資訊網——每日最新資訊28at.com

與 logrus 類似,zap 也允許支持通過配置來決定日志輸出的位置,但實現方式略有不同。在 zap 中,日志輸出是通過配置 zapcore.Core 實現的。在創建 zapcore.Core 實例時,需要指定一個 zapcore.WriteSyncer 接口實現作為參數,這個參數直接決定了日志的輸出目標。要創建 zapcore.WriteSyncer 實例,通常使用 zapcore.AddSync() 函數,它接收一個類型為 io.Writer 的參數。cbG28資訊網——每日最新資訊28at.com

下面是一個使用 zap 創建日志實例的基本示例:cbG28資訊網——每日最新資訊28at.com

writer := zapcore.AddSync(os.Stdout) // 使用標準輸出作為日志目標core := zapcore.NewCore(    zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()),    writer,    zap.InfoLevel,)logger := zap.New(core)defer logger.Sync() // 刷新任何緩沖的日志條目// 使用 logger 進行日志記錄

關鍵在于 zapcore.AddSync() 函數,該函數接收一個類型為 io.Writer 的參數,這一參數用于指定日志的輸出目標,無論是標準輸出、文件,還是其他自定義的輸出載體。cbG28資訊網——每日最新資訊28at.com

slog 日志庫

slog 是在 go 1.21.0 版本引入的一個官網日志庫,它提供了結構化日志。如果想要更詳細地了解 slog 日志庫,自薦一篇文章 Go slog 包:開啟結構化日志的奇妙之旅。cbG28資訊網——每日最新資訊28at.com

與 logrus 和 zap 類似,slog 也允許用戶通過指定 io.Writer 參數來設置日志輸出的目標。這一設置是在創建 slog.Handler 接口的實現時進行的。cbG28資訊網——每日最新資訊28at.com

textLogger := slog.New(slog.NewTextHandler(os.Stdout, nil))jsonLogger := slog.New(slog.NewJSONHandler(os.Stdout, nil))

在這兩個函數中,slog.NewTextHandler 和 slog.NewJSONHandler 第一個參數的類型都是 io.Writer。cbG28資訊網——每日最新資訊28at.com

淺析總結

在對 logurs、zap 和 slog 這三個主流日志庫的分析中,我們可以發現一個關鍵的共同點:它們在處理日志輸出時均依賴于 io.Writer 接口。這些日志庫通過將 io.Writer接口作為關鍵參數的類型,以便設置日志的輸出目標。cbG28資訊網——每日最新資訊28at.com

圖片圖片cbG28資訊網——每日最新資訊28at.com

日志輪轉與切割功能的實現機制與實踐

實現機制

在淺析了 logurs、zap 和 slog 日志庫的設計后,我們發現了它們的共同點。現在,讓我們深入了解日志輪轉與切割功能的實現機制。cbG28資訊網——每日最新資訊28at.com

為了實現 日志文件的輪轉與切割,通常我們會借助第三方庫,如 lumberjack,當然還有其他類似的庫可供選擇,這里就不一一列舉了。cbG28資訊網——每日最新資訊28at.com

lumberjack 是一個專門設計用于日志輪轉和切割的庫,其作用可以類比于一個可插拔的組件。我們可以通過配置該組件,并將其 集成 到所選的日志庫中,從而實現日志文件的輪轉與切割功能。cbG28資訊網——每日最新資訊28at.com

初始化 lumberjack 組件的代碼如下所示:cbG28資訊網——每日最新資訊28at.com

log := &lumberjack.Logger{    Filename:   "/path/file.log", // 日志文件的位置    MaxSize:    10, // 文件最大尺寸(以MB為單位)    MaxBackups: 3, // 保留的最大舊文件數量    MaxAge:     28, // 保留舊文件的最大天數    Compress:   true, // 是否壓縮/歸檔舊文件    LocalTime:  true, // 使用本地時間創建時間戳}

在這個例子中,我們創建了一個 lumberjack.Logger 實例,并設置了以下參數:cbG28資訊網——每日最新資訊28at.com

  • Filename:指定日志文件的存儲路徑。
  • MaxSize:日志文件達到多少 MB 后進行輪轉。
  • MaxBackups:最多保留多少個舊日志文件。
  • MaxAge:舊文件保留的最長時間(天)。
  • Compress:是否壓縮舊文件(如轉換為.gz)。

需要特別注意的是, lumberjack 的 Logger 結構體實現了 io.Writer 接口。這意味著所有關于日志文件的輪轉與切割的核心邏輯都封裝在 Write 方法中。這一實現也方便 Logger 結構體被集成到任何支持 io.Writer 參數的日志庫中。cbG28資訊網——每日最新資訊28at.com

明白了這些,想必你已經知道如何實現日志輪轉與切割的功能了吧。lumberjack 的 logger  結構體實現了 io.Writer 接口,因此將它傳遞到第三方庫中,就能完成集成配置了。cbG28資訊網——每日最新資訊28at.com

實踐

logrus 日志庫的實現

log := &lumberjack.Logger{    Filename:   "/path/file.log", // 日志文件的位置    MaxSize:    10,               // 文件最大尺寸(以MB為單位)    MaxBackups: 3,                // 保留的最大舊文件數量    MaxAge:     28,               // 保留舊文件的最大天數    Compress:   true,             // 是否壓縮/歸檔舊文件    LocalTime:  true,             // 使用本地時間創建時間戳}logger := logrus.New()logger.Out = log

zap 日志庫的實現

log := &lumberjack.Logger{    Filename:   "/path/file.log", // 日志文件的位置    MaxSize:    10,               // 文件最大尺寸(以MB為單位)    MaxBackups: 3,                // 保留的最大舊文件數量    MaxAge:     28,               // 保留舊文件的最大天數    Compress:   true,             // 是否壓縮/歸檔舊文件    LocalTime:  true,             // 使用本地時間創建時間戳}writer := zapcore.AddSync(log)core := zapcore.NewCore(    zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()),    writer,    zap.InfoLevel,)logger := zap.New(core)defer logger.Sync() // 刷新任何緩沖的日志條目

slog 日志庫的實現

log := &lumberjack.Logger{    Filename:   "/path/file.log", // 日志文件的位置    MaxSize:    10,               // 文件最大尺寸(以MB為單位)    MaxBackups: 3,                // 保留的最大舊文件數量    MaxAge:     28,               // 保留舊文件的最大天數    Compress:   true,             // 是否壓縮/歸檔舊文件    LocalTime:  true,             // 使用本地時間創建時間戳}textLogger := slog.New(slog.NewTextHandler(log, nil))jsonLogger := slog.New(slog.NewJSONHandler(log, nil))

小結

本文對三個熱門的日志庫 logrus、zap 和 slog 設計要素進行淺析,我們發現雖然它們在創建日志實例的細節上有所差異,但它們共同依賴于 io.Writer 接口參數來處理日志的輸出。掌握如何配置 io.Writer 參數,并結合 lumberjack 庫的使用,我們就可以實現日志文件的輪轉與切割功能。cbG28資訊網——每日最新資訊28at.com

即使后面推出新的日志庫,我們也可以通過類似的方法,快速地集成日志文件的輪轉與切割功能。cbG28資訊網——每日最新資訊28at.com

本文轉載自微信公眾號「Go技術干貨」,可以通過以下二維碼關注。轉載本文請聯系Go技術干貨公眾號。cbG28資訊網——每日最新資訊28at.com

cbG28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-34558-0.htmlGo 淺析主流日志庫:從設計層學習如何集成日志輪轉與切割功能

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 三個中國程序員 vs三個美國程序員,不得不承認,差距太大了!

下一篇: 優雅實現API接口開關:讓你的應用更可控

標簽:
  • 熱門焦點
  • 6月安卓手機性能榜:vivo/iQOO霸占旗艦排行榜前三

    2023年上半年已經正式過去了,我們也迎來了安兔兔V10版本,在新的驍龍8Gen3和天璣9300發布之前,性能榜的榜單大體會以驍龍8Gen2和天璣9200+為主,至于那顆3.36GHz的驍龍8Gen2領先
  • 太卷!Redmi MAX 100英寸電視便宜了:12999元買Redmi史上最大屏

    8月5日消息,從小米商城了解到,Redmi MAX 100英寸巨屏電視日前迎來官方優惠,到手價12999元,比發布價便宜了7000元,在大屏電視市場開卷。據了解,Redmi MAX 100
  • 這款新興工具平臺,讓你的電腦效率翻倍

    隨著信息技術的發展,我們獲取信息的渠道越來越多,但是處理信息的效率卻成為一個瓶頸。于是各種工具應運而生,都在爭相解決我們的工作效率問題。今天我要給大家介紹一款效率
  • 一個注解實現接口冪等,這樣才優雅!

    場景碼猿慢病云管理系統中其實高并發的場景不是很多,沒有必要每個接口都去考慮并發高的場景,比如添加住院患者的這個接口,具體的業務代碼就不貼了,業務偽代碼如下:圖片上述代碼有
  • 猿輔導與新東方的兩種“歸途”

    作者|卓心月 出品|零態LT(ID:LingTai_LT)如何成為一家偉大企業?答案一定是對“勢”的把握,這其中最關鍵的當屬對企業戰略的制定,且能夠站在未來看現在,即使這其中的
  • 消費結構調整丨巨頭低價博弈,拼多多還卷得動嗎?

    來源:征探財經作者:陳香羽隨著流量紅利的退潮,電商的存量博弈越來越明顯。曾經主攻中高端與品質的淘寶天貓、京東重拾“低價”口號。而過去與他們錯位競爭的拼多多,靠
  • 阿里大調整

    來源:產品劉有媒體報道稱,近期淘寶天貓集團啟動了近年來最大的人力制度改革,涉及員工績效、層級體系等多個核心事項,目前已形成一個初步的“征求意見版”:1、取消P序列
  • 阿里瓴羊One推出背后,零售企業迎數字化新解

    作者:劉曠近年來隨著數字經濟的高速發展,各式各樣的SaaS應用服務更是層出不窮,但本質上SaaS大多局限于單一業務流層面,對用戶核心關切的增長問題等則沒有提供更好的解法。在Saa
  • 英特爾Xe HPG游戲顯卡:擁有512EU,單風扇版本

    據10 月 30 日外媒 TheVerge 消息報道,英特爾 Xe HPG Arc Alchemist 的正面實被曝光,不僅擁有 512 EU 版顯卡,還擁有 128EU 的單風扇版本。另外,這款顯卡 PCB
Top 主站蜘蛛池模板: 景德镇市| 赤壁市| 杂多县| 陵川县| 彭山县| 图们市| 叙永县| 东兰县| 宜君县| 上虞市| 武陟县| 临漳县| 大竹县| 阳高县| 思茅市| 育儿| 治多县| 建平县| 纳雍县| 崇礼县| 肃南| 奇台县| 郸城县| 图木舒克市| 老河口市| 巴彦淖尔市| 韶山市| 乌审旗| 安丘市| 屏南县| 盐边县| 赤壁市| 红桥区| 徐水县| 石渠县| 桐乡市| 重庆市| 宜宾市| 昭通市| 化德县| 赤城县|