linux

Golang日志级别设置指南

小樊
34
2025-04-28 13:30:28
栏目: 编程语言

在Go语言中,日志级别可以通过多种方式设置,这取决于你使用的日志库。以下是几个流行日志库的日志级别设置指南:

  1. 标准库 log: Go的标准库提供了一个简单的日志记录功能,但它没有提供设置日志级别的直接方法。不过,你可以通过输出日志的格式化字符串来控制输出的日志级别。例如,你可以自定义日志格式化函数来包含日志级别信息。

  2. 第三方日志库 logruslogrus 是一个流行的日志库,它提供了丰富的日志功能,包括日志级别的设置。以下是如何使用 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级别的日志") // 这条日志会触发程序恐慌并退出
}
  1. 第三方日志库 zapzap 是由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级别的日志")
}
  1. 自定义日志库 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.")
}

请注意,这些示例代码仅展示了如何设置日志级别,实际使用时你可能需要根据具体需求调整日志库的配置和使用方式。

0
看了该问题的人还看了