一架梯子,一头程序猿,仰望星空!
Go Fiber教程 > 内容正文

Go Fiber日志处理


Fiber日志

我们可以使用日志来观察程序的行为、诊断问题或配置相应的告警。定义一个良好结构化的日志可以提高搜索效率并便于处理问题。

Fiber提供了一种默认的方式在标准输出中打印日志。它还提供了几个全局函数,例如log.Infolog.Errorflog.Warnw等。

日志级别

const (
    LevelTrace Level = iota
    LevelDebug
    LevelInfo
    LevelWarn
    LevelError
    LevelFatal
    LevelPanic
)

自定义日志

Fiber提供了AllLogger接口以适应各种日志库。

type CommonLogger interface {
    Logger
    FormatLogger
    WithLogger
}

type AllLogger interface {
    CommonLogger
    ControlLogger
    WithLogger
}

打印日志

注意:调用Fatal级别的方法会在打印日志后中断程序运行,请谨慎使用。直接打印不同级别的日志,这些日志将被输入到messageKey中,默认为msg。

log.Info("Hello, World!")
log.Debug("Are you OK?")
log.Info("42 is the answer to life, the universe, and everything")
log.Warn("We are under attack!")
log.Error("Houston, we have a problem.")
log.Fatal("So Long, and Thanks for All the Fislog.")
log.Panic("The system is down.")

格式化打印不同级别的日志,所有方法都以f结尾。

log.Debugf("Hello %s", "boy")
log.Infof("%d is the answer to life, the universe, and everything", 233)
log.Warnf("We are under attack %s!", "boss")
log.Errorf("%s, we have a problem.", "Master Shifu")
log.Fatalf("So Long, and Thanks for All the %s.", "banana")

打印带有键和值的消息,如果键和值不成对,则打印KEYVALS UNPAIRED

log.Debugw("", "Hello", "boy")
log.Infow("", "number", 233)
log.Warnw("", "job", "boss")
log.Errorw("", "name", "Master Shifu")
log.Fatalw("", "fruit", "banana")

全局日志

如果您在一个项目中,只想使用一个简单的日志函数,在全局的任何时候都可以打印,我们提供了一个全局日志。

import "github.com/gofiber/fiber/v2/log"

log.Info("info")
log.Warn("warn")

上述代码使用了默认的log.DefaultLogger标准输出。您还可以在contrib下找到已经实现的适配器,或使用您自己实现的Logger,并使用log.SetLogger设置全局日志记录器。

import (
    "log"
    fiberlog "github.com/gofiber/fiber/v2/log"
)

var _ log.AllLogger = (*customLogger)(nil)

type customLogger struct {
    stdlog *log.Logger
}

// ...
// 注入自定义日志记录器
fiberlog.SetLogger(customLogger)

设置级别

log.SetLevel设置低于该级别的日志将不会输出。默认日志记录器为LevelTrace。

请注意,此方法不是并发安全的。

import "github.com/gofiber/fiber/v2/log"

log.SetLevel(log.LevelInfo)

设置输出

log.SetOutput设置日志记录器的输出目标。默认的日志记录器在控制台中打印日志。

var logger AllLogger = &defaultLogger{
    stdlog: log.New(os.Stderr, "", log.LstdFlags|log.Lshortfile|log.Lmicroseconds),
    depth:  4,
}

将输出目标设置为文件。

// 输出到test.log文件
f, err := os.OpenFile("test.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
    return
}
log.SetOutput(f)

将输出目标设置为控制台和文件。

// 输出到test.log文件
file, _ := os.OpenFile("test.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
iw := io.MultiWriter(os.Stdout, file)
log.SetOutput(iw)

绑定上下文

设置上下文,使用以下方法将返回一个绑定到指定上下文的CommonLogger实例。

commonLogger := log.WithContext(ctx)
commonLogger.Info("info")

提示:这是Fiber框架默认的日志库,当然你可以选择其他知名的Go开源日志库