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日志.....")