更新时间:

#go logrus

#main.go

package main

import (
    "fmt"

    "demo-log/logs"

    "github.com/sirupsen/logrus"
)

func main() {

    log := logs.New(logs.Config{
        Module:   "testMain",
        Level:    "INFO",
        Handler:  "terminal",
        Filename: "xxxx.log",
        Color:    true,
    })

    name := "hello"
    age := 1

    log.WithFields(logrus.Fields{"name": name, "age": age}).Info("this is a message")
    fmt.Println("---------")

    logger := log.WithFields(logrus.Fields{"name": name, "age": age})
    logger.Info("this is message info log")
    logger.Warn("this is message warn log")
    fmt.Println("---------")
    log.Warn("this is a message", "name", name, "age", age)
    log.Error("this is a message", "name", name, "age", age)
    log.Debug("this is a message", "name", name, "age", age)
}
package logs

import (
    "os"
    "strings"
    "time"

    rotatelogs "github.com/lestrrat-go/file-rotatelogs"
    "github.com/sirupsen/logrus"
)

const (
    FileLogger     = "file"
    TerminalLogger = "terminal"
)

type Logger struct {
    *logrus.Logger
}

// hook can config log into mongodb redis ...
type logHook struct {
    ModuleName string
}

func (h *logHook) Levels() []logrus.Level {
    return logrus.AllLevels
}

func (h *logHook) Fire(entry *logrus.Entry) error {
    entry.Data["Module"] = h.ModuleName
    return nil
}

type Config struct {
    Module   string `json:"module" yaml:"module"`
    Level    string `json:"level" yaml:"level"`
    Handler  string `json:"handler" yaml:"handler"`
    Filename string `json:"filename" yaml:"filename"`
    Color    bool   `json:"color" yaml:"color"`
}

func New(conf Config) *Logger {
    logger := &Logger{
        Logger: logrus.New(),
    }
    if conf.Module != "" {
        h := &logHook{ModuleName: conf.Module}
        logger.Logger.AddHook(h)
    }
    level := getLevel(conf.Level)
    logger.Logger.SetLevel(level)
    // 在输出日志中添加文件名和方法信息
    //logger.Logger.SetReportCaller(true)

    logger.Logger.SetFormatter(
        &logrus.TextFormatter{
            DisableColors:   !conf.Color,
            FullTimestamp:   true,
            TimestampFormat: "2006-01-02|15:04:05.000",
        })
    switch strings.ToLower(conf.Handler) {
    case FileLogger:
        if conf.Filename == "" {
            panic("you must refer logger file")
        }
        // lumberjackrus  another one with hook
        writer, _ := rotatelogs.New(
            conf.Filename+".%Y%m%d%H",
            rotatelogs.WithLinkName(conf.Filename),
            rotatelogs.WithMaxAge(time.Duration(12)*time.Hour),
            rotatelogs.WithRotationTime(time.Duration(1)*time.Hour),
        )
        logger.Logger.SetOutput(writer)

    case TerminalLogger:
        //mw := io.MultiWriter(os.Stdout, writer)
        logger.Logger.SetOutput(os.Stdout)
    default:
        panic("unknown logger handler" + conf.Handler)
    }

    return logger
}

func SetLoggerModule(module string, conf Config) Config {
    if module == conf.Module {
        return conf
    }
    return Config{
        Module:   module,
        Level:    conf.Level,
        Handler:  conf.Handler,
        Filename: conf.Filename,
    }
}
func getLevel(level string) logrus.Level {
    switch strings.ToUpper(level) {
    case "DEBUG":
        return logrus.DebugLevel
    case "INFO":
        return logrus.InfoLevel
    case "WARN", "WARNING":
        return logrus.WarnLevel
    case "ERROR", "EROR":
        return logrus.ErrorLevel
    case "FATAL", "CRITICAL":
        return logrus.FatalLevel
    default:
        return logrus.DebugLevel
    }
}

#go.mod

module demo-log

go 1.18

require (
	github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible
	github.com/sirupsen/logrus v1.9.0
)

require (
	github.com/jonboulle/clockwork v0.4.0 // indirect
	github.com/lestrrat-go/strftime v1.0.6 // indirect
	github.com/pkg/errors v0.9.1 // indirect
	golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect
)