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

golang 日志log與logrus示例詳解

 更新時(shí)間:2025年03月31日 12:00:56   作者:草海桐  
log是Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)中一個(gè)簡(jiǎn)單的日志庫(kù),本文給大家介紹golang 日志log與logrus示例詳解,感興趣的朋友一起看看吧

一、Go 標(biāo)準(zhǔn)庫(kù) log 詳解

1. 功能特點(diǎn)

log 是 Go 語(yǔ)言標(biāo)準(zhǔn)庫(kù)中一個(gè)簡(jiǎn)單的日志庫(kù),主要功能包括:

  • 寫入日志到指定位置(默認(rèn)為標(biāo)準(zhǔn)錯(cuò)誤)
  • 支持_FATAL 和 _ERROR 等級(jí)別的日志
  • 支持格式化日志輸出

2. 常用函數(shù)

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

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

3. 示例代碼

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

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

優(yōu)勢(shì)

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

局限

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

二、第三方庫(kù) logrus 詳解

1. 功能特點(diǎn)

logrus 是 Go 語(yǔ)言中一個(gè)功能強(qiáng)大的日志庫(kù),主要特點(diǎn)如下:

  • 支持多種日志級(jí)別:Debug、Info、WarningError、Fatal、Panic
  • 支持兩種輸出格式:text 和 json
  • 支持日志輪轉(zhuǎn)(結(jié)合 lumberjack 包)
  • 支持鉤子(Hooks)機(jī)制,擴(kuò)展日志處理邏輯
  • 支持多種輸出目標(biāo)(文件、網(wǎng)絡(luò)、console 等)

2. 核心功能

以下是 logrus 的核心功能:

          1 .多日志級(jí)別

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

        2. 格式化輸出

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

        3. 切換輸出格式

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

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

logger.SetOutput(os.Stdout) // 輸出到標(biāo)準(zhǔn)輸出  

        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. 示例代碼

以下是一個(gè)完整的 logrus 示例代碼,包含日志級(jí)別、格式化、文件輪轉(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 實(shí)例  
    logger := logrus.New()  
    // 2. 配置日志級(jí)別  
    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("這是一個(gè) Info 級(jí)別的日志")  
    // 7. 帶字段的日志  
    logger.WithFields(logrus.Fields{  
        "username": "Bob",  
        "age":      25,  
    }).Error("用戶未找到")  
    // 8. 處理信號(hào)  
    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ā)送日志到遠(yuǎn)程服務(wù)器  
    log.Printf("鉤子處理:%+v\n", entry)  
    return nil  
}  

4. 優(yōu)勢(shì)和擴(kuò)展性

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

三、總結(jié)

1. 何時(shí)選擇 log?

  • 當(dāng)項(xiàng)目的日志需求簡(jiǎn)單(只需要基本的日志輸出)。
  • 項(xiàng)目不希望引入額外的依賴。

2. 何時(shí)選擇 logrus?

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

3. 對(duì)比總結(jié)

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

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

相關(guān)文章

  • Golang map與sync.map的異同詳解

    Golang map與sync.map的異同詳解

    在Go語(yǔ)言中,map和sync.Map都是用于存儲(chǔ)鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu),但它們?cè)诓l(fā)安全性、性能和使用場(chǎng)景上存在顯著差異,接下來(lái)將深入探討這兩種數(shù)據(jù)結(jié)構(gòu)的異同,感興趣的朋友可以參考下
    2024-01-01
  • Go語(yǔ)言基于Goroutine的超時(shí)控制方案設(shè)計(jì)與實(shí)踐

    Go語(yǔ)言基于Goroutine的超時(shí)控制方案設(shè)計(jì)與實(shí)踐

    Go語(yǔ)言因其并發(fā)特性而備受青睞,尤其是goroutine和channel的組合,像一對(duì)默契的搭檔,為開(kāi)發(fā)者提供了輕量、高效的并發(fā)工具,下面我們來(lái)看看基于goroutine的超時(shí)控制方案吧
    2025-05-05
  • 使用Go語(yǔ)言提高圖片分辨率的方法與實(shí)踐

    使用Go語(yǔ)言提高圖片分辨率的方法與實(shí)踐

    在圖像處理和計(jì)算機(jī)視覺(jué)領(lǐng)域,提高圖片分辨率是一個(gè)常見(jiàn)的問(wèn)題,隨著高分辨率顯示設(shè)備的普及,如4K、8K電視以及高像素手機(jī)攝像頭的應(yīng)用,用戶對(duì)高質(zhì)量圖片的需求也越來(lái)越高,本文將介紹使用Golang語(yǔ)言提高圖片分辨率的方法與實(shí)踐,需要的朋友可以參考下
    2023-12-12
  • Golang JSON的進(jìn)階用法實(shí)例講解

    Golang JSON的進(jìn)階用法實(shí)例講解

    這篇文章主要給大家介紹了關(guān)于Golang JSON進(jìn)階用法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用golang具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • Go 第三方庫(kù)之類型轉(zhuǎn)換問(wèn)題

    Go 第三方庫(kù)之類型轉(zhuǎn)換問(wèn)題

    今天給大家介紹一個(gè)第三方庫(kù),專門處理類型轉(zhuǎn)換的問(wèn)題。對(duì)Go 第三方庫(kù)之類型轉(zhuǎn)換問(wèn)題感興趣的朋友跟隨小編一起看看吧
    2021-08-08
  • golang如何判斷字符串是否包含中文

    golang如何判斷字符串是否包含中文

    這篇文章主要介紹了golang如何判斷字符串是否包含中文問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-07-07
  • Golang控制協(xié)程執(zhí)行順序方法詳解

    Golang控制協(xié)程執(zhí)行順序方法詳解

    這篇文章主要介紹了Golang控制協(xié)程執(zhí)行順序的方法,Golang的語(yǔ)法和運(yùn)行時(shí)直接內(nèi)置了對(duì)并發(fā)的支持。Golang里的并發(fā)指的是能讓某個(gè)函數(shù)獨(dú)立于其他函數(shù)運(yùn)行的能力
    2022-11-11
  • GoLang中Module的基本使用方法

    GoLang中Module的基本使用方法

    Go module是從Go 1.11版本才引入的新功能,下面這篇文章主要給大家介紹了關(guān)于GoLang中Module的基本使用方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • Go 日志封裝實(shí)戰(zhàn)示例詳解

    Go 日志封裝實(shí)戰(zhàn)示例詳解

    這篇文章主要為大家介紹了Go 日志封裝實(shí)戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Go string轉(zhuǎn)int,int64,int32及注意事項(xiàng)說(shuō)明

    Go string轉(zhuǎn)int,int64,int32及注意事項(xiàng)說(shuō)明

    這篇文章主要介紹了Go string轉(zhuǎn)int,int64,int32及注意事項(xiàng)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07

最新評(píng)論