在Go语言中,日志级别可以通过多种方式设置,这取决于你使用的日志库。以下是几个流行日志库的日志级别设置指南:
标准库 log
包:
Go的标准库提供了一个简单的日志记录功能,但它没有提供设置日志级别的直接方法。不过,你可以通过输出日志的格式化字符串来控制输出的日志级别。例如,你可以自定义日志格式化函数来包含日志级别信息。
第三方日志库 logrus
:
logrus
是一个流行的日志库,它提供了丰富的日志功能,包括日志级别的设置。以下是如何使用 logrus
设置日志级别的示例代码:
package main
import (
"github.com/sirupsen/logrus"
)
func main() {
// 创建一个新的logrus实例
logger := logrus.New()
// 设置日志级别
logger.SetLevel(logrus.InfoLevel)
// 输出不同级别的日志
logger.Trace("这是一条Trace级别的日志")
logger.Debug("这是一条Debug级别的日志")
logger.Info("这是一条Info级别的日志")
logger.Warn("这是一条Warn级别的日志")
logger.Error("这是一条Error级别的日志")
// logger.Fatal("这是一条Fatal级别的日志") // 这条日志会触发程序退出
// logger.Panic("这是一条Panic级别的日志") // 这条日志会触发程序恐慌并退出
}
zap
:
zap
是由Uber开源的一个高性能日志库,它也支持日志级别的设置。以下是如何使用 zap
设置日志级别的示例代码:package main
import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
func main() {
// 创建一个新的zap logger
logger := zap.NewProduction()
// 获取core
core := logger.Core()
// 设置日志级别
core.SetLevel(zap.NewAtomicLevelAt(zap.InfoLevel))
// 使用logger
logger.Info("这是一条Info级别的日志")
}
ylog
:
如果你需要更高级的功能,你可以自己实现一个日志库。例如,下面是一个简单的自定义日志库的实现,它支持设置日志级别:package main
import (
"fmt"
"log"
"os"
"sync"
"time"
)
type FileLogger struct {
lastHour int64
file *os.File
level LogLevel
mu sync.Mutex
iLogger *log.Logger
Path string
}
type LogLevel int
const (
LevelTrace LogLevel = iota
LevelDebug
LevelInfo
LevelWarn
LevelError
LevelFatal
)
func (l *FileLogger) CanInfo() bool {
return l.level <= LevelInfo
}
func (l *FileLogger) Info(v ...interface{}) {
if l.CanInfo() {
l.ensureFile()
v = append([]interface{}{"Info ", v...)
l.iLogger.Output(2, fmt.Sprintln(v...))
}
}
func (l *FileLogger) ensureFile() {
currentTime := time.Now()
curHour := currentTime.Hour()
if l.lastHour != curHour {
l.mu.Lock()
defer l.mu.Unlock()
if l.file != nil {
l.file.Close()
}
l.createFile(currentTime, curHour)
}
}
func (l *FileLogger) createFile(curTime time.Time, curHour int64) error {
var err error
l.file, err = os.OpenFile(l.Path, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
return err
}
l.iLogger.SetOutput(l.file)
l.iLogger.SetFlags(log.Lshortfile | log.Ldate | log.Ltime | log.Lmicroseconds)
l.lastHour = curHour
return nil
}
func main() {
ylog := &FileLogger{
Path: "./logs",
level: LevelInfo,
iLogger: log.New(os.Stdout, "", log.Ldate|log.Ltime|log.Lshortfile),
}
ylog.Info("I am a Info log.")
}
请注意,这些示例代码仅展示了如何设置日志级别,实际使用时你可能需要根据具体需求调整日志库的配置和使用方式。