简介
logrus
是一个第三方日志库,性能虽不如zap
和zerolog
,但方便易用灵活。logrus
完全兼容标准的log
库,还支持文本、JSON两种日志输出格式。
特点
- 相较于标准库,logrus有更细致的日志级别,从高到低分别是:trace > debug > info > warn > error > fatal > panic
- 支持自定义日志格式,内置支持JSON格式。
- 支持可扩展的 Hooks 机制,可以为不同级别的日志添加 Hooks 将日志记录到不同位置。
- 并发安全。
安装
go get github.com/sirupsen/logrus
快速入门
package main import ( "github.com/sirupsen/logrus" ) func main() { logrus.SetLevel(logrus.TraceLevel) // 默认为info日志级别 logrus.Trace("trace log") logrus.Debug("debug log") logrus.Info("Info log") logrus.Warn("warn log") logrus.Error("error log") logrus.Panic("panic log") // panic会输出报错然后终止程序 logrus.Fatal("fatal log") // fatal会直接终止程序 }
自定义log模块
需求:自定义日志模块,实现日志文件自动分割,同时向控制台和文件输出日志。
示例代码:
tmpgo/pkg/log/log.go
package log import ( "os" "path/filepath" "github.com/orandin/lumberjackrus" "github.com/sirupsen/logrus" ) var logger *logrus.Logger var logDirPath string = "logs" var logFilePath string func init() { // logs目录是否存在, 不存在则创建 if _,err := os.Stat(logDirPath); os.IsNotExist(err) { os.MkdirAll(logDirPath, os.ModePerm) } logFilePath = filepath.Join(logDirPath, "app.log") logger = logrus.New() logger.SetOutput(os.Stdout) // 在标准输出中显示日志内容 logger.SetLevel(logrus.InfoLevel) // 标准输出中的日志级别 logger.SetFormatter(&logrus.JSONFormatter{ // 标准输出以json形式显示日志 TimestampFormat: "2006-01-02 15:04:05.000", }) logger.AddHook(rotateHook()) // 通过添加hook的方式实现日志输出到文件中并自动切割 } // 日志文件自动切割 func rotateHook() logrus.Hook { hook, err := lumberjackrus.NewHook(&lumberjackrus.LogFile{ Filename: logFilePath, MaxAge: 1, MaxSize: 100, MaxBackups: 30, Compress: true, LocalTime: false, }, logrus.InfoLevel, &logrus.JSONFormatter{TimestampFormat: "2006-01-02 15:04:05.000"}, &lumberjackrus.LogFileOpts{}) if err != nil { logrus.Fatal(err) } return hook } func Info(v ...interface{}) { logger.Info(v) } func Infof(format string, v ...interface{}) { logger.Infof(format, v...) } func Warn(v ...interface{}) { logger.Warn(v) } func Warnf(format string, v ...interface{}) { logger.Warnf(format, v...) } func Debug(v ...interface{}) { logger.Debug(v) } func Debugf(format string, v ...interface{}) { logger.Debugf(format, v...) } func Error(v ...interface{}) { logger.Error(v) } func Errorf(format string, v ...interface{}) { logger.Errorf(format, v...) } func Panic(v ...interface{}) { logger.Panic(v) } func Panicf(format string, v ...interface{}) { logger.Panicf(format, v...) } func Fatal(v ...interface{}) { logger.Fatal(v) } func Fatalf(format string, v ...interface{}) { logger.Fatalf(format, v...) }
main.go
中使用
package main import ( "tmpgo/pkg/log" ) func main() { log.Debug("debug log") log.Info("Info log") log.Warn("warn log") log.Error("error log") }