golang logrus日志框架实例详解

 更新时间:2023年08月02日 09:54:21   作者:RSFeegg  
logrus是一个可插拔的、结构化的日志框架,这篇文章主要介绍了golang logrus日志框架实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

logrus简介

logrus是一个可插拔的、结构化的日志框架。
logrus拥有六种日志级别:debug、info、warn、error、fatal和panic
可扩展的Hook机制:
允许使用者通过hook的方式将日志分发到任意地方,如本地文件系统、标准输出、logstash、elasticsearch或者mq等,或者通过hook定义日志内容和格式等。
logrus内置了两种日志格式,JSONFormatter和TextFormatter,如果这两个格式不满足需求,可以自己动手实现接口Formatter,来定义自己的日志格式。
logrus鼓励通过Field机制进行精细化的、结构化的日志记录,而不是通过冗长的消息来记录日志。

写一个简单的例子

package main
import (
  log "github.com/sirupsen/logrus"
)
func main() {
  log.WithFields(log.Fields{
    "animal": "walrus",
  }).Info("A walrus appears")
}

高级用法

logger是一种相对高级的用法, 对于一个大型项目, 往往需要一个全局的logrus实例,即logger对象来记录项目所有的日志。

一些默认的初始化

package main
import (
  log "github.com/sirupsen/logrus"
)
func main() {
	var log = logrus.New()
	// 设置日志级别为xx以及以上
	 log.SetLevel(logrus.InfoLevel)
	 //JSON在生产中通常只在使用Splunk或Logstash等工具进行日志聚合时才有用。
	 // 设置日志格式为json格式
	// log.SetFormatter(&logrus.JSONFormatter{
	// 	// PrettyPrint: true,//格式化json
	// 	TimestampFormat: "2006-01-02 15:04:05",//时间格式化
	// })
	log.SetFormatter(&logrus.TextFormatter{
		TimestampFormat: "2006-01-02 15:04:05",//时间格式化
	})
	// 设置将日志输出到标准输出(默认的输出为stderr,标准错误)
	// 日志消息输出可以是任意的io.writer类型
	log.SetOutput(os.Stdout)
    // 初始化一些公共参数
	loginit:=log.WithFields(logrus.Fields{
		"animal": "walrus",
	})
	//输出日志
	log.Info("A walrus appears")
}

在日志中打印文件行号等信息

log.SetReportCaller(true)可以打印行号

package main
import (
  "github.com/sirupsen/logrus"
  "os"
  "runtime"
	"time"
)
func main() {
// logger是一种相对高级的用法, 对于一个大型项目, 往往需要一个全局的logrus实例,即logger对象来记录项目所有的日志。
	var log = logrus.New()
	log.SetReportCaller(true) // 显示行号等信息
	 // 设置日志级别为xx以及以上
	 log.SetLevel(logrus.InfoLevel)
	log.SetFormatter(&logrus.TextFormatter{
		TimestampFormat: "2006-01-02 15:04:05",//时间格式化
	})
	// 设置将日志输出到标准输出(默认的输出为stderr,标准错误)
	// 日志消息输出可以是任意的io.writer类型
	log.SetOutput(os.Stdout)
	// 初始化一些公共参数
	loginit:=log.WithFields(logrus.Fields{
		"animal": "walrus",
	})
	log.Info("A walrus appears")
}

golang logrus日志框架

logrus自定义log 日志

废话不多说,直接举个栗子

package main
import (
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/sirupsen/logrus"
	"net/http"
	"os"
)
var log=logrus.New()//创建一个log实例
func initLogrus()error{
	log.Formatter=&logrus.JSONFormatter{}//设置为json格式的日志
    file,err:=os.OpenFile("./gin_log.log",os.O_CREATE|os.O_WRONLY|os.O_APPEND,0644)//创建一个log日志文件
    if err!=nil{
		fmt.Println("创建文件/打开文件失败!")
		return err
    }
    log.Out=file//设置log的默认文件输出
    gin.SetMode(gin.ReleaseMode)//发布版本
    gin.DefaultWriter=log.Out//gin框架自己记录的日志也会输出
    log.Level=logrus.InfoLevel//设置文件级别
    return nil
}
func main() {
	err:=initLogrus()
	if err!=nil{
		fmt.Println(err)
		return
	}
	r := gin.Default()
	r.GET("/logrus", func(c *gin.Context) {
		//定义写入log日志的信息
		log.WithFields(logrus.Fields{
			"url":c.Request.RequestURI,
			"method":c.Request.Method,
			"params":c.Query("name"),
			"IP":c.ClientIP(),
		}).Info()
		resData:= struct {
			Code int `json:"code"`
			Msg string `json:"msg"`
			Data interface{} `json:"data"`
		}{http.StatusOK,"响应成功","OK"}
		c.JSON(http.StatusOK,resData)
	})
	r.Run(":9090")
}
# 码完直接go run 某go 文件。如果没安装import那些依赖。直接go mod tidy;

上效果

在这里插入图片描述

在这里插入图片描述

logrus设置最大保存时间、设置日志切割时间间隔等

package main
import (
	"fmt"
	"github.com/gin-gonic/gin"
	rotatelogs "github.com/lestrrat-go/file-rotatelogs"
	"github.com/rifflock/lfshook"
	"github.com/sirupsen/logrus"
	"net/http"
	"os"
	"path"
	"time"
)
var (
	logFilePath="./"//文件存储路径
	logFileName="system.log"
)
func main() {
	r := gin.Default()
	//添加中间件,主要实现log日志的生成
	r.Use(logMiddleware())
	r.GET("/logrus2", func(c *gin.Context) {
		c.JSON(http.StatusOK,gin.H{
			"code":200,
			"msg":"响应成功",
			"data":"ok",
		})
	})
	r.Run(":9090")
}
func logMiddleware() gin.HandlerFunc{
	//日志文件
	fileName := path.Join(logFilePath, logFileName)
	file,err:=os.OpenFile(fileName,os.O_CREATE|os.O_WRONLY|os.O_APPEND,0644)//创建一个log日志文件
	if err!=nil{
		fmt.Println(err)
	}
	//實例化
	logger:=logrus.New()
	//设置日志级别
	logger.SetLevel(logrus.DebugLevel)
	logger.Out=file//设置log的默认文件输出
	logWriter,err:=rotatelogs.New(
		//分割后的文件名称
		fileName+".%Y%m%d.log",
		//生成软链接,指向最新日志文件
		rotatelogs.WithLinkName(fileName),
		//设置最大保存时间7天
		rotatelogs.WithMaxAge(7*24*time.Hour),
		//设置日志切割时间间隔(1天)
		rotatelogs.WithRotationTime(1*time.Hour),
	)
	//hook机制的设置
	writerMap:=lfshook.WriterMap{
		logrus.InfoLevel:  logWriter,
		logrus.FatalLevel: logWriter,
		logrus.DebugLevel: logWriter,
		logrus.WarnLevel:  logWriter,
		logrus.ErrorLevel: logWriter,
		logrus.PanicLevel: logWriter,
	}
	//给logrus添加hook
	logger.AddHook(lfshook.NewHook(writerMap,&logrus.JSONFormatter{
		TimestampFormat:  "2006-01-02 15:04:05",
	}))
	return func(c *gin.Context) {
		c.Next()
		//请求方法
		method:=c.Request.Method
		//请求路由
		reqUrl:=c.Request.RequestURI
		//状态码
		statusCode:=c.Writer.Status()
		//请求ip
		clientIp:=c.ClientIP()
		logger.WithFields(logrus.Fields{
			"status_code":statusCode,
			"client_ip":clientIp,
			"req_method":method,
			"req_url":reqUrl,
		}).Info()
	}
}

到此这篇关于golang logrus日志框架的文章就介绍到这了,更多相关golang logrus日志框架内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文详解golang延时任务的实现

    一文详解golang延时任务的实现

    这篇文章主要为大家介绍了golang延时任务的实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • 使用Go开发硬件驱动程序的流程步骤

    使用Go开发硬件驱动程序的流程步骤

    Golang是一种简洁、高效的编程语言,它的强大并发性能和丰富的标准库使得它成为了开发硬件驱动的理想选择,在本文中,我们将探讨如何使用Golang开发硬件驱动程序,并提供一个实例来帮助你入门,需要的朋友可以参考下
    2023-11-11
  • Go语言中的自定义错误类型

    Go语言中的自定义错误类型

    本文主要介绍了Go语言中的自定义错误类型,通过定义结构体并实现Error接口,创建包含参数和错误信息的自定义错误,具有一定的参考价值,感兴趣的可以了解一下
    2025-05-05
  • Golang使用gzip压缩字符减少redis等存储占用的实现

    Golang使用gzip压缩字符减少redis等存储占用的实现

    本文主要介绍了Golang使用gzip压缩字符减少redis等存储占用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • Golang并发编程之GMP模型详解

    Golang并发编程之GMP模型详解

    传统的并发编程模型是基于线程和共享内存的同步访问控制的,共享数据受锁的保护,线程将争夺这些锁以访问数据。本文将介绍Go并发编程中的GMP模型,感兴趣的可以了解一下
    2023-03-03
  • 在 Golang 中使用 Cobra 创建 CLI 应用

    在 Golang 中使用 Cobra 创建 CLI 应用

    这篇文章主要介绍了在 Golang 中使用 Cobra 创建 CLI 应用,来看下 Cobra 的使用,这里我们使用的 go1.13.3 版本,使用 Go Modules 来进行包管理,需要的朋友可以参考下
    2022-01-01
  • Go语言中处理JSON数据的编码和解码的方法

    Go语言中处理JSON数据的编码和解码的方法

    在Go语言中,处理JSON数据的编码和解码主要依赖于标准库中的encoding/json包,这个包提供了两个核心的函数:Marshal和Unmarshal,本文给大家介绍了Go语言中处理JSON数据的编码和解码的方法,需要的朋友可以参考下
    2024-04-04
  • go语言中使用timer的常用方式

    go语言中使用timer的常用方式

    这篇文章主要介绍了go语言中使用timer的常用方式,实例分析了三种常用的使用timer的方法,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • golangci-lint安装与Goland集成问题

    golangci-lint安装与Goland集成问题

    这篇文章主要介绍了golangci-lint安装与Goland集成,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-12-12
  • Go使用sync.Pool提高性能的代码示例

    Go使用sync.Pool提高性能的代码示例

    在高性能应用程序中,频繁的内存分配和回收是性能瓶颈的常见原因之一,Go 语言提供了 sync.Pool 类型,它可以用来存储和重用临时对象,本文将详细介绍如何在 Go 中使用 sync.Pool,并通过实际代码示例来展示其对性能的提升效果,需要的朋友可以参考下
    2024-04-04

最新评论