更新时间:
#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
)