#go logrus#main.gopackage 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.modmodule 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 )