其他分享
首页 > 其他分享> > go logrus实战应用

go logrus实战应用

作者:互联网

简单记录一下logrus实战应用,详细了解可以移步官网,这是直接使用
上代码:
logrus整个项目应用封装

package log

import (
	"fmt"
	"github.com/sirupsen/logrus"
	"go_service/config"
	"os"
	"path"
	"time"
)
var log = logrus.New()
func Debug(fileds logrus.Fields,args ...interface{})  {
	setOutPutFile(logrus.DebugLevel,fileds ,args)
	logrus.WithFields(fileds).Debug(args)
}
func Info(fileds logrus.Fields,args ...interface{})  {
	setOutPutFile(logrus.InfoLevel,fileds ,args)
	logrus.WithFields(fileds).Info(args)
}
func Warn(fileds logrus.Fields,args ...interface{})  {
	setOutPutFile(logrus.WarnLevel,fileds ,args)
	logrus.WithFields(fileds).Warn(args)
}
func Fatal(fileds logrus.Fields,args ...interface{})  {
	setOutPutFile(logrus.FatalLevel,fileds ,args)
	logrus.WithFields(fileds).Fatal(args)
}
func Error(fileds logrus.Fields,args ...interface{})  {
	setOutPutFile(logrus.ErrorLevel,fileds ,args)
	log.WithFields(fileds).Error(args)
}
func Panic(fileds logrus.Fields,args ...interface{})  {
	setOutPutFile(logrus.PanicLevel,fileds ,args)
	logrus.WithFields(fileds).Panic(args)
}
func Trace(fileds logrus.Fields,args ...interface{})  {
	setOutPutFile(logrus.TraceLevel,fileds ,args)
	logrus.WithFields(fileds).Trace(args)
}
//level logrus.Level
func setOutPutFile(level logrus.Level,fileds logrus.Fields,args ...interface{})  {
	if _,err := os.Stat(config.BaseConf.Log.Dir);os.IsNotExist(err){
		err = os.MkdirAll(config.BaseConf.Log.Dir,0777)
		if err != nil {
			panic(fmt.Errorf("create log dir '%s' error:%s",config.BaseConf.Log.Dir,err))
		}
	}
	fileName := path.Join("./"+config.BaseConf.Log.Dir,time.Now().Format("2006-01-02") + ".log")
	var err error
	files,err := os.OpenFile(fileName,os.O_WRONLY|os.O_APPEND|os.O_SYNC|os.O_CREATE|os.O_RDWR,0766)
	if err != nil{
		fmt.Print("open log file err",err)
	}else{
		log.Out = files
	}
	logrus.SetOutput(files)
	logrus.SetLevel(level)
	return
}

这里日志文件我是根据自己的需求,每天一个日志文件,可以根据自己的习惯应用去设置日志的生成;
日志问价位置配置
config文件下
config.yaml

log:
  dir: /logs/

config.go

package config

import (
	"gopkg.in/yaml.v2"
	"io/ioutil"
)

var BaseConf Config

type LogConf struct {
	Dir string `yaml:"dir"`
}
type Config struct {
	Log LogConf `yaml:"log"`
}

func Init()  {
	confPath := "config/config.yaml"

	if yamlFile,err:= ioutil.ReadFile(confPath);err != nil {
		panic("read config err:" + err.Error())
	}else if err = yaml.Unmarshal(yamlFile,&BaseConf); err != nil{
		panic("conf file unmarshal error:"+err.Error())
	}
}

这里配置日志文件位置,当然也是可以直接写的,但是在建议配置在一个文件中,然后项目启动是调用

r := gin.Default()
	//r.Use(middleware.LoggerToFile())
	config.Init()

然后就是项目使用

log.Error(logrus.Fields{"err":err.Error(),"source":pkg.GetPath()},"Model - FindArticle - Count")

这其中pkg.GetPath()是获取当前执行文件的路径以及报错行数
pak方法

package pkg

import (
	"runtime"
	"strconv"
)

func GetPath() string {
	_,path,line,_:= runtime.Caller(1)
	response := path +":" + strconv.Itoa(line)
	return response
}

后面呈现打印的日志
在这里插入图片描述
至于中间件,如果是大型项目多台服务器,使用更好,我这没必要也就没写入,下面直接放中间件代码:

package middleware

import (
	"bytes"
	"github.com/gin-gonic/gin"
	"github.com/sirupsen/logrus"
	"go_service/log"
	"io/ioutil"
	"time"
)

func LoggerToFile() gin.HandlerFunc {
	return func(ctx *gin.Context) {
		//开始时间
		start := time.Now()
		//请求报文
		var resquestBody []byte

		if ctx.Request.Body != nil{
			var err error
			resquestBody,err = ctx.GetRawData()
			if err != nil {
				log.Warn(logrus.Fields{"err":err.Error()},"get http request")
			}
			ctx.Request.Body = ioutil.NopCloser(bytes.NewBuffer(resquestBody))
		}
		//处理请求
		ctx.Next()
		//结束时间
		end := time.Now()

		log.Info(map[string]interface{}{
			"statsCode":ctx.Writer.Status(),
			"cost":float64(end.Sub(start).Nanoseconds()/1e4)/100.0,
			"clientlp":ctx.ClientIP(),
			"method":ctx.Request.Method,
			"url":ctx.Request.RequestURI,
		})
	}
}

在启动项目时使用

r := gin.Default()
r.Use(middleware.LoggerToFile())

打印日志:
在这里插入图片描述
肯定有更好的方法,但是自己没研究出来,就先使用的现在的封装
本文连接:点击
博主个人小博客:嘿嘿

标签:实战,fileds,log,err,logrus,args,go,config
来源: https://blog.csdn.net/qq_40896095/article/details/118766047