[golang]使用logrus自定义日志模块

简介

logrus是一个第三方日志库,性能虽不如zapzerolog,但方便易用灵活。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")
}

参考

posted @ 2023-04-10 22:48  花酒锄作田  阅读(139)  评论(0编辑  收藏  举报