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

golang 日志log與logrus示例詳解

 更新時間:2025年03月31日 12:00:56   作者:草海桐  
log是Go語言標準庫中一個簡單的日志庫,本文給大家介紹golang 日志log與logrus示例詳解,感興趣的朋友一起看看吧

一、Go 標準庫 log 詳解

1. 功能特點

log 是 Go 語言標準庫中一個簡單的日志庫,主要功能包括:

  • 寫入日志到指定位置(默認為標準錯誤)
  • 支持_FATAL 和 _ERROR 等級別的日志
  • 支持格式化日志輸出

2. 常用函數(shù)

log 包中常用的函數(shù)如下:

函數(shù)名功能
log.Print輸出日志
log.Printf格式化輸出日志
log.Println輸出日志,自動換行
log.Fatal輸出日志并調(diào)用 os.Exit(1)
log.Fatalf格式化輸出日志并退出
log.Panic輸出日志并引發(fā) panic
log.Panicln格式化輸出日志并引發(fā) panic
log.SetFlags設(shè)置日志格式(日期、時間等)
log.SetOutput設(shè)置日志輸出目標

3. 示例代碼

package main  
import (  
    "log"  
    "os"  
)  
func main() {  
    // 1. 默認輸出到標準錯誤  
    log.Println("這是一條普通日志")  
    // 2. 格式化輸出  
    name := "Alice"  
    age := 30  
    log.Printf("用戶 %s 已經(jīng) %d 歲了\n", name, age)  
    // 3. 設(shè)置日志輸出目標為文件  
    file, err := os.OpenFile("log.txt", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)  
    if err != nil {  
        log.Fatal(err)  
    }  
    log.SetOutput(file)  
    log.Println("日志已切換到文件輸出")  
    // 4. 設(shè)置日志格式(默認包含時間信息)  
    log.SetFlags(log.LstdFlags)  
    //Ldate         = 1 << iota     // 使用本地時區(qū)的日期:2009/01/23
	//Ltime                         // 使用本地時區(qū)的時間:01:23:23
	//Lmicroseconds                 // 微秒精度的時間:01:23:23.123123。假設(shè)啟用了Ltime
	//Llongfile                     // 完整文件名和行號:/a/b/c/d.go:23
	//Lshortfile                    // 文件名的最后一部分和行號:d.go:23。覆蓋Llongfile
	//LUTC                          // 如果設(shè)置了Ldate或Ltime,則使用UTC而不是本地時區(qū)
	//Lmsgprefix                    // 將“前綴”從行首移動到消息之前
	//LstdFlags     = Ldate | Ltime // 標準logger的初始值,包含日期和時間
    log.Println("這是一條包含時間的日志")  
    log.Panic("Panic\n")
	//log.Fatal("Fatal\n")
}  

4. 優(yōu)勢和局限

優(yōu)勢

  • 內(nèi)置庫,使用簡單,不需要額外依賴。
  • 支持基本的日志輸出和格式化。

局限

  • 功能較簡單,不支持多日志級別(如 DEBUG、INFO、WARNING 等)。
  • 不支持 JSON 格式化輸出。
  • 不支持日志輪轉(zhuǎn)(logrotate)。

二、第三方庫 logrus 詳解

1. 功能特點

logrus 是 Go 語言中一個功能強大的日志庫,主要特點如下:

  • 支持多種日志級別:Debug、Info、Warning、Error、FatalPanic
  • 支持兩種輸出格式:text 和 json
  • 支持日志輪轉(zhuǎn)(結(jié)合 lumberjack 包)
  • 支持鉤子(Hooks)機制,擴展日志處理邏輯
  • 支持多種輸出目標(文件、網(wǎng)絡、console 等)

2. 核心功能

以下是 logrus 的核心功能:

          1 .多日志級別

logger.Debug("調(diào)試日志")  
logger.Info("信息日志")  
logger.Warn("警告日志")  
logger.Error("錯誤日志")  
logger.Fatal("致命錯誤")  
logger.Panic("panic 日志")  

        2. 格式化輸出

logger.WithFields(logrus.Fields{  
    "username": "Alice",  
    "age":       30,  
}).Info("用戶信息")  

        3. 切換輸出格式

// 切換到 JSON 格式  
logger.SetFormatter(&logrus.JSONFormatter{})  
// 配置日志格式為 text(默認)
//logger.SetFormatter(&logrus.TextFormatter{})

        4.設(shè)置日志輸出目標

logger.SetOutput(os.Stdout) // 輸出到標準輸出  

        5. 日志輪轉(zhuǎn)(結(jié)合 lumberjack)

// 須import(
    lumberjack "gopkg.in/natefinch/lumberjack.v2"
)
writer := &lumberjack.Logger{  
    Filename:   "logs/app.log",  
    MaxSize:     500, // MB  
    MaxBackups:  3,  
    MaxAge:      28, // days  
    Compress:   true,  
}  
logger.SetOutput(writer)  

3. 示例代碼

以下是一個完整的 logrus 示例代碼,包含日志級別、格式化、文件輪轉(zhuǎn)和鉤子功能:

package main  
import (  
    "log"  
    "os"  
    "os/signal"  
    "syscall"  
    "time"  
    lumberjack "gopkg.in/natefinch/lumberjack.v2" 
    "github.com/sirupsen/logrus"  
)  
func main() {  
    // 1. 創(chuàng)建 logger 實例  
    logger := logrus.New()  
    // 2. 配置日志級別  
    logger.SetLevel(logrus.InfoLevel)  
    // 3. 配置日志格式為 JSON  
    logger.SetFormatter(&logrus.JSONFormatter{})  
    // 4. 配置日志輪轉(zhuǎn)  
    writer := &lumberjack.Logger{  
        Filename:   "logs/app.log",  
        MaxSize:     500, // MB  
        MaxBackups:  3,  
        MaxAge:      28, // days  
        Compress:   true,  
    }  
    logger.SetOutput(writer)  
    // 5. 添加鉤子(Hook)  
    logger.AddHook(&MyHook{})  
    // 6. 寫入日志  
    logger.Info("這是一個 Info 級別的日志")  
    // 7. 帶字段的日志  
    logger.WithFields(logrus.Fields{  
        "username": "Bob",  
        "age":      25,  
    }).Error("用戶未找到")  
    // 8. 處理信號  
    signalChan := make(chan os.Signal, 1)  
    signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM)  
    go func() {  
        <-signalChan  
        logger.Info("程序已優(yōu)雅退出")  
        os.Exit(0)  
    }()  
}  
// 自定義鉤子示例  
type MyHook struct{}  
func (*MyHook) Levels() []logrus.Level {  
    return []logrus.Level{  
        logrus.InfoLevel,  
        logrus.ErrorLevel,  
    }  
}  
func (*MyHook) Fire(entry *logrus.Entry) error {  
    // 鉤子邏輯:例如發(fā)送日志到遠程服務器  
    log.Printf("鉤子處理:%+v\n", entry)  
    return nil  
}  

4. 優(yōu)勢和擴展性

  • 優(yōu)勢
    • 功能強大,支持多日志級別和格式化。
    • 高度可定制,支持鉤子機制和多種輸出目標。
    • 社區(qū)生態(tài)豐富,廣泛應用于生產(chǎn)環(huán)境。
  • 擴展性
    • 支持第三方庫擴展(如日志輪轉(zhuǎn)、網(wǎng)絡輸出等)。

三、總結(jié)

1. 何時選擇 log

  • 當項目的日志需求簡單(只需要基本的日志輸出)。
  • 項目不希望引入額外的依賴。

2. 何時選擇 logrus?

  • 項目需要多日志級別和格式化輸出。
  • 需要更高的可定制性和擴展性。
  • 需要支持日志輪轉(zhuǎn)和鉤子機制。

3. 對比總結(jié)

特性loglogrus
日志級別有限(Fatal、Error)多級別(Debug~Panic)
格式化輸出支持支持(Text/JSON)
日志輪轉(zhuǎn)不支持支持(需配合 lumberjack)
鉤子機制不支持支持
輸出目標標準輸出/文件多種(文件、網(wǎng)絡等)
社區(qū)和擴展性內(nèi)置庫第三方庫,社區(qū)豐富

到此這篇關(guān)于golang 日志log與logrus的文章就介紹到這了,更多相關(guān)golang 日志log與logrus內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解析Go?中的?rune?類型

    解析Go?中的?rune?類型

    rune類型是?Go?語言的一種特殊數(shù)字類型,Go?語言通過rune處理中文,支持國際化多語言,本文給大家介紹Go?中的?rune?類型,感興趣的朋友一起看看吧
    2022-03-03
  • Golang中的錯誤處理的示例詳解

    Golang中的錯誤處理的示例詳解

    這篇文章主要為大家詳細介紹了Golang中的錯誤處理的相關(guān)資料,文章中的示例代碼講解詳細,對我們學習Golang有一定幫助,需要的可以參考一下
    2022-11-11
  • golang 在windows中設(shè)置環(huán)境變量的操作

    golang 在windows中設(shè)置環(huán)境變量的操作

    這篇文章主要介紹了golang 在windows中設(shè)置環(huán)境變量的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • 超詳細Go語言中JSON處理技巧分享

    超詳細Go語言中JSON處理技巧分享

    這篇文章主要為大家總結(jié)了go語言中對JSON數(shù)據(jù)結(jié)構(gòu)和結(jié)構(gòu)體之間相互轉(zhuǎn)換問題及解決方法,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-06-06
  • Go實現(xiàn)線程池(工作池)的兩種方式實例詳解

    Go實現(xiàn)線程池(工作池)的兩種方式實例詳解

    這篇文章主要介紹了Go實現(xiàn)線程池(工作池)的兩種方式實例詳解,需要的朋友可以參考下
    2022-04-04
  • 詳解Go語言中調(diào)度器的原理與使用

    詳解Go語言中調(diào)度器的原理與使用

    這篇文章主要介紹了Go語言運行時調(diào)度器的實現(xiàn)原理,其中包含調(diào)度器的設(shè)計與實現(xiàn)原理、演變過程以及與運行時調(diào)度相關(guān)的數(shù)據(jù)結(jié)構(gòu),希望對大家有所幫助
    2023-07-07
  • Go語言操作mysql數(shù)據(jù)庫簡單例子

    Go語言操作mysql數(shù)據(jù)庫簡單例子

    這篇文章主要介紹了Go語言操作mysql數(shù)據(jù)庫簡單例子,本文包含插入數(shù)據(jù)和查詢代碼實例,需要的朋友可以參考下
    2014-10-10
  • Go語言實現(xiàn)漢諾塔算法

    Go語言實現(xiàn)漢諾塔算法

    之前的文章,我們給大家分享了不少漢諾塔算法的實現(xiàn)語言,包括C、c++、java、python等,今天我們就來使用go語言來實現(xiàn)一下,需要的小伙伴來參考下吧。
    2015-03-03
  • go run main.go 一直提示找不到包的解決方案

    go run main.go 一直提示找不到包的解決方案

    這篇文章主要介紹了go run main.go 一直提示找不到包的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go中基本數(shù)據(jù)類型和字符串表示之間轉(zhuǎn)換詳解

    Go中基本數(shù)據(jù)類型和字符串表示之間轉(zhuǎn)換詳解

    這篇文章主要為大家詳細介紹了Go中基本數(shù)據(jù)類型和字符串表示之間轉(zhuǎn)換的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-01-01

最新評論