封装golang logrus日志库

logrus 在 GitHub 上 star 数已达到 21k,golang 也提供了自己的标准库,相对开发者来说,还不是那么友好,logrus完全兼容标准了golang的log库,还支持JSON、文本两种日志输出格式,话不多说,开干。

一、安装

go get -u -v github.com/sirupsen/logrus

二、创建logrus配置文件 【conf/config.conf】

{
  "log_dir": "logs/gin.log",
  "log_level": "info"
}

三、封装公共包

3.1 定义一个结构图

type LogConfig struct {
	LogDir   string `json:"log_dir"`
	LogLevel string `json:"log_level"`
}

3.2 加载 logrus 配置文件

func LoadLogConfig() *LogConfig {
	var (
		err       error
		file      *os.File
		fileData  []byte
		logConfig LogConfig
	)
	logConfig = LogConfig{}
	if file, err = os.Open("conf/config.conf"); err != nil {
		panic(err)
	}

	defer file.Close()

	if fileData, err = ioutil.ReadAll(file); err != nil {
		panic(err)
	}
	json.Unmarshal(fileData, &logConfig)
	return &logConfig
}

3.3 初始化 logrus 配置

var (
		logConf     *LogConfig
		file        *os.File
		err         error
		leveMapping map[string]logrus.Level
	)
	logConf = LoadLogConfig()

	if file, err = os.OpenFile(logConf.LogDir, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666); err != nil {
		panic(err)
	}
	Log.Out = file

	// 日志级别映射
	leveMapping = map[string]logrus.Level{
		"trace": logrus.TraceLevel,
		"debug": logrus.DebugLevel,
		"info":  logrus.InfoLevel,
		"warn":  logrus.WarnLevel,
		"error": logrus.ErrorLevel,
		"fatal": logrus.FatalLevel,
		"panic": logrus.PanicLevel,
	}

	// 设置日志级别
	Log.SetLevel(leveMapping[logConf.LogLevel])

	// 设置日志格式
	Log.SetFormatter(&logrus.TextFormatter{})

4、完整配置文件 【utils/logs.go】

做了7个级别的日志映射,分别对应logrus的7个级别,见 leveMapping

package utils

import (
	"encoding/json"
	"github.com/sirupsen/logrus"
	"io/ioutil"
	"os"
)

var Log = logrus.New()

type LogConfig struct {
	LogDir   string `json:"log_dir"`
	LogLevel string `json:"log_level"`
}

func LoadLogConfig() *LogConfig {
	var (
		err       error
		file      *os.File
		fileData  []byte
		logConfig LogConfig
	)
	logConfig = LogConfig{}
	if file, err = os.Open("conf/config.conf"); err != nil {
		panic(err)
	}

	defer file.Close()

	if fileData, err = ioutil.ReadAll(file); err != nil {
		panic(err)
	}
	json.Unmarshal(fileData, &logConfig)
	return &logConfig
}

func init() {
	var (
		logConf     *LogConfig
		file        *os.File
		err         error
		leveMapping map[string]logrus.Level
	)
	logConf = LoadLogConfig()

	if file, err = os.OpenFile(logConf.LogDir, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666); err != nil {
		panic(err)
	}
	Log.Out = file

	leveMapping = map[string]logrus.Level{
		"trace": logrus.TraceLevel,
		"debug": logrus.DebugLevel,
		"info":  logrus.InfoLevel,
		"warn":  logrus.WarnLevel,
		"error": logrus.ErrorLevel,
		"fatal": logrus.FatalLevel,
		"panic": logrus.PanicLevel,
	}

	Log.SetLevel(leveMapping[logConf.LogLevel])
	Log.SetFormatter(&logrus.TextFormatter{})
}

五、 加载并使用

由于我使用的是gin,在main.go 加载 封装的日志

import _ "ginTest/utils"

根据自己的业务需求,在所需要使用日志的地方,定义即可。

utils.Log.Info("这是Info日志.....")
展开阅读全文
存在即是合理,一切皆有可能。
上一篇

vue3 封装 axios [ 请求拦截、响应拦截 ]

你也可能喜欢

  • 暂无相关文章!

发表评论

您的电子邮件地址不会被公开。 必填项已用 * 标注

提示:点击验证后方可评论!

插入图片
返回顶部

微信扫一扫

微信扫一扫