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

Go?log模塊的使用技巧

 更新時間:2025年11月10日 11:37:27   作者:QX_hao  
Golog模塊是一個強(qiáng)大的日志記錄庫,提供了豐富的功能,如線程安全的日志記錄、靈活的日志格式配置、多種輸出目標(biāo)支持等,它還提供了錯誤處理和程序終止功能,以及自定義Logger的創(chuàng)建,本文給大家介紹Go?log模塊的使用,感興趣的朋友一起看看吧

Go log模塊使用

對于更復(fù)雜的日志需求,可以考慮使用第三方日志庫如zap、logrus等,它們提供了更豐富的功能和更好的性能

1.主要特性

  • 線程安全的日志記錄
  • 靈活的日志格式配置
  • 支持多種輸出目標(biāo)(控制臺、文件等)- 內(nèi)置錯誤處理和程序終止功能
  • 支持自定義Logger創(chuàng)建

2. 基礎(chǔ)日志輸出

2.1 基本日志方法

log包提供了三種基本的日志輸出方法:

package main
import "log"
func main() {
    // Println - 自動添加換行符
    log.Println("這是一條日志信息")
    // Printf - 格式化輸出
    str := "this is a test of log"
    log.Printf("%s", str)
    // Print - 不添加換行符
    log.Print("這條信息沒有換行")
}

2.2 錯誤處理日志

log包還提供了在記錄日志后終止程序的特殊方法:

package main
import "log"
func main() {
    // Fatal系列函數(shù)會在日志輸出后調(diào)用os.Exit(1)
    log.Fatalf("觸發(fā)fatal錯誤,程序?qū)⑼顺?)
    // Panic系列函數(shù)會在日志輸出后調(diào)用panic()
    log.Panicln("觸發(fā)panic錯誤")
}

注意:Fatal和Panic方法調(diào)用后程序會終止,后續(xù)代碼不會執(zhí)行。

3. 日志格式配置

3.1 設(shè)置日志標(biāo)志

使用SetFlags方法可以配置日志的輸出格式:

package main
import "log"
func main() {
    // 設(shè)置日志格式標(biāo)志
    log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
    log.Println("設(shè)置完格式后的日志信息")
}

3.2 可用的日志標(biāo)志

log包定義了以下常量來控制日志格式:

const (
    Ldate         = 1 << iota     // 日期:2009/01/23
    Ltime                         // 時間:01:23:23
    Lmicroseconds                 // 微秒級別的時間:01:23:23.123123
    Llongfile                     // 文件全路徑名+行號:/a/b/c/d.go:23
    Lshortfile                    // 文件名+行號:d.go:23
    LUTC                          // 使用UTC時間
    LstdFlags     = Ldate | Ltime // 標(biāo)準(zhǔn)logger的初始值
)

4. 日志前綴配置

4.1 設(shè)置日志前綴

使用SetPrefix方法可以為日志添加前綴:

package main
import "log"
func main() {
    log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
    // 默認(rèn)無前綴
    log.Println("沒有設(shè)置前綴的日志信息")
    // 設(shè)置前綴
    log.SetPrefix("INFO: ")
    log.Println("設(shè)置完日志前綴的信息")
    // 獲取當(dāng)前前綴
    prefix := log.Prefix()
    log.Printf("當(dāng)前前綴是:%s", prefix)
}

5. 文件日志輸出

5.1 將日志輸出到文件

使用SetOutput方法可以將日志重定向到文件:

package main
import (
    "log"
    "os"
    "time"
)
// 全局文件變量
var logfile *os.File
func init() {
    // 創(chuàng)建日志目錄
    os.Mkdir("log", 0755)
    // 打開或創(chuàng)建日志文件
    var err error
    logfile, err = os.OpenFile("log/"+time.Now().Format("2006-01-02")+".log", 
        os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
    if err != nil {
        log.Fatalf("打開日志文件失敗:%v", err)
        return
    }
    // 配置日志
    log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
    log.SetOutput(logfile)
    log.SetPrefix("Prefix:")
}
func main() {
    // 確保文件關(guān)閉
    defer logfile.Close()
    log.Println("這是一條寫入文件的日志信息")
}

5.2 文件打開模式說明

  • os.O_CREATE:如果文件不存在則創(chuàng)建
  • os.O_WRONLY:只寫模式打開文件
  • os.O_APPEND:追加模式,新內(nèi)容添加到文件末尾
  • 0666:文件權(quán)限設(shè)置

6. 自定義Logger

6.1 使用log.New()創(chuàng)建自定義Logger

log.New()函數(shù)允許創(chuàng)建具有特定配置的Logger實(shí)例:

package main
import (
    "log"
    "os"
    "time"
)
func main() {
    // 創(chuàng)建日志目錄
    os.Mkdir("log", 0755)
    // 打開日志文件
    logfile, err := os.OpenFile("log/"+time.Now().Format("2006-01-02")+".log", 
        os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
    if err != nil {
        log.Fatal(err)
        return
    }
    defer logfile.Close()
    // 創(chuàng)建自定義Logger
    logger := log.New(logfile, "new:", log.Ldate|log.Ltime|log.Lshortfile)
    logger.Println("使用New()來創(chuàng)造自己的logger對象")
}

6.2 多個Logger實(shí)例

可以創(chuàng)建多個Logger實(shí)例用于不同的日志目的:

package main
import (
    "log"
    "os"
)
func main() {
    // 創(chuàng)建不同用途的Logger
    infoLogger := log.New(os.Stdout, "INFO: ", log.Ldate|log.Ltime)
    errorLogger := log.New(os.Stderr, "ERROR: ", log.Ldate|log.Ltime|log.Lshortfile)
    infoLogger.Println("這是一條信息日志")
    errorLogger.Println("這是一條錯誤日志")
}

7. 高級用法

7.1 日志級別管理

雖然log包本身不提供日志級別,但可以通過自定義實(shí)現(xiàn):

package main
import (
    "log"
    "os"
    "io"
)
type LogLevel int
const (
    DEBUG LogLevel = iota
    INFO
    WARN
    ERROR
    FATAL
)
type Logger struct {
    debug *log.Logger
    info  *log.Logger
    warn  *log.Logger
    error *log.Logger
    fatal *log.Logger
    level LogLevel
}
func NewLogger(out io.Writer, level LogLevel) *Logger {
    flags := log.Ldate | log.Ltime | log.Lshortfile
    return &Logger{
        debug: log.New(out, "DEBUG: ", flags),
        info:  log.New(out, "INFO: ", flags),
        warn:  log.New(out, "WARN: ", flags),
        error: log.New(out, "ERROR: ", flags),
        fatal: log.New(out, "FATAL: ", flags),
        level: level,
    }
}
func (l *Logger) Debug(v ...interface{}) {
    if l.level <= DEBUG {
        l.debug.Println(v...)
    }
}
func (l *Logger) Info(v ...interface{}) {
    if l.level <= INFO {
        l.info.Println(v...)
    }
}
// 其他級別方法類似...

7.2 并發(fā)安全的日志記錄

log包的所有方法都是線程安全的,可以在并發(fā)環(huán)境中安全使用:

package main
import (
    "log"
    "sync"
)
func main() {
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func(id int) {
            defer wg.Done()
            log.Printf("協(xié)程 %d 正在執(zhí)行", id)
        }(i)
    }
    wg.Wait()
    log.Println("所有協(xié)程執(zhí)行完畢")
}

8. 最佳實(shí)踐

8.1 錯誤處理

package main
import (
    "log"
    "os"
)
func setupLogger() (*os.File, error) {
    file, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
    if err != nil {
        return nil, err
    }
    log.SetOutput(file)
    log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
    return file, nil
}
func main() {
    logFile, err := setupLogger()
    if err != nil {
        log.Fatal("初始化日志失敗:", err)
    }
    defer logFile.Close()
    // 應(yīng)用程序邏輯...
    log.Println("應(yīng)用程序啟動成功")
}

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

相關(guān)文章

  • 學(xué)會提升Go語言編碼效率技巧拒絕加班!

    學(xué)會提升Go語言編碼效率技巧拒絕加班!

    這篇文章主要為大家介紹了Go語言編碼效率提升技巧詳解,學(xué)會了從此拒絕加班,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • 自動生成代碼controller?tool的簡單使用

    自動生成代碼controller?tool的簡單使用

    這篇文章主要為大家介紹了自動生成代碼controller?tool的簡單使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Go語言基礎(chǔ)學(xué)習(xí)之map的示例詳解

    Go語言基礎(chǔ)學(xué)習(xí)之map的示例詳解

    哈希表是常見的數(shù)據(jù)結(jié)構(gòu),有的語言會將哈希稱作字典或者映射,在Go中,哈希就是常見的數(shù)據(jù)類型map,本文就來聊聊Golang中map的相關(guān)知識吧
    2023-04-04
  • Go遍歷struct,map,slice的實(shí)現(xiàn)

    Go遍歷struct,map,slice的實(shí)現(xiàn)

    本文主要介紹了Go語言遍歷結(jié)構(gòu)體、切片和字典的方法,對大家的學(xué)習(xí)具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06
  • Go語言規(guī)范context?類型的key用法示例解析

    Go語言規(guī)范context?類型的key用法示例解析

    這篇文章主要為大家介紹了Go語言規(guī)范context?類型的key用法示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • go語言中切片Slice與數(shù)組Array對比以及panic:?runtime?error:?index?out?of?range問題解決

    go語言中切片Slice與數(shù)組Array對比以及panic:?runtime?error:?index?out?

    go語言中數(shù)組與其他語言有在顯著的不同,包括其不能夠進(jìn)行添加,以及值拷貝的特性,下面這篇文章主要給大家介紹了關(guān)于go語言中切片Slice與數(shù)組Array對比以及panic:?runtime?error:?index?out?of?range問題解決的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • golang實(shí)現(xiàn)大文件讀取的代碼示例

    golang實(shí)現(xiàn)大文件讀取的代碼示例

    在實(shí)際工作,我們需要讀取大數(shù)據(jù)文件,文件可能上G百G,所以我們不可能一次性的讀取到內(nèi)存,接下來本文給大家介紹了golang實(shí)現(xiàn)大文件讀取的示例,需要的朋友可以參考下
    2024-04-04
  • Golang如何將上傳的文件壓縮成zip(小案例)

    Golang如何將上傳的文件壓縮成zip(小案例)

    這篇文章主要介紹了Golang如何將上傳的文件壓縮成zip(小案例),這是一個簡單的golang壓縮文件小案例,可做很多的拓展,這里使用的庫是archive/zip,在gopkg里面搜zip就行,需要的朋友可以參考下
    2024-01-01
  • 詳解Go語言的context包從放棄到入門

    詳解Go語言的context包從放棄到入門

    這篇文章主要介紹了Go語言的context包從放棄到入門,本文通過實(shí)例演示給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Golang中時間相關(guān)操作合集

    Golang中時間相關(guān)操作合集

    這篇文章主要為大家介紹了Golang中的各種時間相關(guān)操作,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09

最新評論