返回顶部
首页 > 资讯 > 精选 >zap接收gin框架默认的日志并配置日志归档的方法
  • 682
分享到

zap接收gin框架默认的日志并配置日志归档的方法

2023-06-30 04:06:38 682人浏览 安东尼
摘要

这篇“zap接收gin框架默认的日志并配置日志归档的方法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“zap接收gin框架默

这篇“zap接收gin框架默认的日志并配置日志归档的方法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“zap接收gin框架默认的日志并配置日志归档的方法”文章吧。

gin默认的中间件

首先我们来看一个最简单的gin项目

func main() {r := gin.Default()r.GET("/hello", func(c *gin.Context) {c.String("hello liwenzhou.com!")})r.Run(}

接下来我们看一下gin.Default()源码

func Default() *Engine {debugPrintWARNINGDefault()engine := New()engine.Use(Logger(), Recovery())return engine}

也就是我们在使用gin.Default()的同时是用到了gin框架内的两个默认中间件Logger()Recovery()

其中Logger()是把gin框架本身的日志输出到标准输出(我们本地开发调试时在终端输出的那些日志就是它的功劳),而Recovery()是在程序出现panic的时候恢复现场并写入500响应的。

基于zap的中间件

我们可以模仿Logger()Recovery()的实现,使用我们的日志库来接收gin框架默认输出的日志。

这里以zap为例,我们实现两个中间件如下:

// GinLogger 接收gin框架默认的日志func GinLogger(logger *zap.Logger) gin.HandlerFunc {return func(c *gin.Context) {start := time.Now()path := c.Request.URL.Pathquery := c.Request.URL.RawQueryc.Next()cost := time.Since(start)logger.Info(path,zap.Int("status", c.Writer.Status()),zap.String("method", c.Request.Method),zap.String("path", path),zap.String("query", query),zap.String("ip", c.ClientIP()),zap.String("user-agent", c.Request.UserAgent()),zap.String("errors", c.Errors.ByType(gin.ErrorTypePrivate).String()),zap.Duration("cost", cost),)}}// GinRecovery recover掉项目可能出现的panicfunc GinRecovery(logger *zap.Logger, stack bool) gin.HandlerFunc {return func(c *gin.Context) {defer func() {if err := recover(); err != nil {// Check for a broken connection, as it is not really a// condition that warrants a panic stack trace.var brokenPipe boolif ne, ok := err.(*net.OpError); ok {if se, ok := ne.Err.(*os.SyscallError); ok {if strings.Contains(strings.ToLower(se.Error()), "broken pipe") || strings.Contains(strings.ToLower(se.Error()), "connection reset by peer") {brokenPipe = true}}}HttpRequest, _ := httputil.DumpRequest(c.Request, false)if brokenPipe {logger.Error(c.Request.URL.Path,zap.Any("error", err),zap.String("request", string(httpRequest)),)// If the connection is dead, we can't write a status to it.c.Error(err.(error)) // nolint: errcheckc.Abort()return}if stack {logger.Error("[Recovery from panic]",zap.Any("error", err),zap.String("request", string(httpRequest)),zap.String("stack", string(debug.Stack())),)} else {logger.Error("[Recovery from panic]",zap.Any("error", err),zap.String("request", string(httpRequest)),)}c.AbortWithStatus(http.StatusInternalServerError)}}()c.Next()}}

如果不想自己实现,可以使用GitHub上有别人封装好的https://github.com/gin-contrib/zap。

这样我们就可以在gin框架中使用我们上面定义好的两个中间件来代替gin框架默认的Logger()Recovery()了。

r := gin.New()r.Use(GinLogger(), GinRecovery())

在gin项目中使用zap

最后我们再加入我们项目中常用的日志切割,完整版的logger.Go代码如下:

package loggerimport ("gin_zap_demo/config""net""net/http""net/http/httputil""os""runtime/debug""strings""time""github.com/gin-gonic/gin""github.com/natefinch/lumberjack""go.uber.org/zap""go.uber.org/zap/zapcore")var lg *zap.Logger// InitLogger 初始化Loggerfunc InitLogger(cfg *config.LoGConfig) (err error) {writeSyncer := getLogWriter(cfg.Filename, cfg.MaxSize, cfg.MaxBackups, cfg.MaxAge)encoder := getEncoder()var l = new(zapcore.Level)err = l.UnmarshalText([]byte(cfg.Level))if err != nil {return}core := zapcore.NewCore(encoder, writeSyncer, l)lg = zap.New(core, zap.AddCaller())zap.ReplaceGlobals(lg) // 替换zap包中全局的logger实例,后续在其他包中只需使用zap.L()调用即可return}func getEncoder() zapcore.Encoder {encoderConfig := zap.NewProductionEncoderConfig()encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoderencoderConfig.TimeKey = "time"encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoderencoderConfig.EncodeDuration = zapcore.SecondsDurationEncoderencoderConfig.EncodeCaller = zapcore.ShortCallerEncoderreturn zapcore.NewJSONEncoder(encoderConfig)}func getLogWriter(filename string, maxSize, maxBackup, maxAge int) zapcore.WriteSyncer {lumberJackLogger := &lumberjack.Logger{Filename:   filename,MaxSize:    maxSize,MaxBackups: maxBackup,MaxAge:     maxAge,}return zapcore.AddSync(lumberJackLogger)}// GinLogger 接收gin框架默认的日志func GinLogger() gin.HandlerFunc {return func(c *gin.Context) {start := time.Now()path := c.Request.URL.Pathquery := c.Request.URL.RawQueryc.Next()cost := time.Since(start)lg.Info(path,zap.Int("status", c.Writer.Status()),zap.String("method", c.Request.Method),zap.String("path", path),zap.String("query", query),zap.String("ip", c.ClientIP()),zap.String("user-agent", c.Request.UserAgent()),zap.String("errors", c.Errors.ByType(gin.ErrorTypePrivate).String()),zap.Duration("cost", cost),)}}// GinRecovery recover掉项目可能出现的panic,并使用zap记录相关日志func GinRecovery(stack bool) gin.HandlerFunc {return func(c *gin.Context) {defer func() {if err := recover(); err != nil {// Check for a broken connection, as it is not really a// condition that warrants a panic stack trace.var brokenPipe boolif ne, ok := err.(*net.OpError); ok {if se, ok := ne.Err.(*os.SyscallError); ok {if strings.Contains(strings.ToLower(se.Error()), "broken pipe") || strings.Contains(strings.ToLower(se.Error()), "connection reset by peer") {brokenPipe = true}}}httpRequest, _ := httputil.DumpRequest(c.Request, false)if brokenPipe {lg.Error(c.Request.URL.Path,zap.Any("error", err),zap.String("request", string(httpRequest)),)// If the connection is dead, we can't write a status to it.c.Error(err.(error)) // nolint: errcheckc.Abort()return}if stack {lg.Error("[Recovery from panic]",zap.Any("error", err),zap.String("request", string(httpRequest)),zap.String("stack", string(debug.Stack())),)} else {lg.Error("[Recovery from panic]",zap.Any("error", err),zap.String("request", string(httpRequest)),)}c.AbortWithStatus(http.StatusInternalServerError)}}()c.Next()}}

然后定义日志相关配置:

type LogConfig struct {Level string `json:"level"`Filename string `json:"filename"`MaxSize int `json:"maxsize"`MaxAge int `json:"max_age"`MaxBackups int `json:"max_backups"`}

在项目中先从配置文件加载配置信息,再调用logger.InitLogger(config.Conf.LogConfig)即可完成logger实例的初识化。其中,通过r.Use(logger.GinLogger(), logger.GinRecovery(true))注册我们的中间件来使用zap接收gin框架自身的日志,在项目中需要的地方通过使用zap.L().Xxx()方法来记录自定义日志信息。

package mainimport ("fmt""gin_zap_demo/config""gin_zap_demo/logger""net/http""os""go.uber.org/zap""github.com/gin-gonic/gin")func main() {// load config from config.jsonif len(os.Args) < 1 {return}if err := config.Init(os.Args[1]); err != nil {panic(err)}// init loggerif err := logger.InitLogger(config.Conf.LogConfig); err != nil {fmt.Printf("init logger failed, err:%v\n", err)return}gin.SetMode(config.Conf.Mode)r := gin.Default()// 注册zap相关中间件r.Use(logger.GinLogger(), logger.GinRecovery(true))r.GET("/hello", func(c *gin.Context) {// 假设你有一些数据需要记录到日志中var (name = "q1mi"age  = 18)// 记录日志并使用zap.Xxx(key, val)记录相关字段zap.L().Debug("this is hello func", zap.String("user", name), zap.Int("age", age))c.String(http.StatusOK, "hello liwenzhou.com!")})addr := fmt.Sprintf(":%v", config.Conf.Port)r.Run(addr)}

以上就是关于“zap接收gin框架默认的日志并配置日志归档的方法”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: zap接收gin框架默认的日志并配置日志归档的方法

本文链接: https://lsjlt.com/news/327317.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • zap接收gin框架默认的日志并配置日志归档的方法
    这篇“zap接收gin框架默认的日志并配置日志归档的方法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“zap接收gin框架默...
    99+
    2023-06-30
  • zap接收gin框架默认的日志并配置日志归档示例
    目录使用zap接收gin框架默认的日志并配置日志归档gin默认的中间件基于zap的中间件在gin项目中使用zap使用zap接收gin框架默认的日志并配置日志归档 我们在基于gin框架...
    99+
    2024-04-02
  • pgsql归档日志的配置方法
    这篇文章主要介绍“pgsql归档日志的配置方法”,在日常操作中,相信很多人在pgsql归档日志的配置方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”pgsql归档日志的配置...
    99+
    2024-04-02
  • rman备份归档日志的方法
    这篇文章主要介绍“rman备份归档日志的方法”,在日常操作中,相信很多人在rman备份归档日志的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”rman备份归档日志的方法”...
    99+
    2024-04-02
  • oracle归档日志设置的方法是什么
    要设置Oracle归档日志,可以按照以下步骤进行操作: 确保数据库处于归档模式: 在SQL*Plus命令行中执行以下命令: SQ...
    99+
    2024-04-09
    oracle
  • Oracle归档日志管理的方法有哪些
    这篇文章主要讲解了“Oracle归档日志管理的方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Oracle归档日志管理的方法有哪些”吧!一般情况下,...
    99+
    2024-04-02
  • oracle关闭归档日志的方法是什么
    要关闭Oracle数据库的归档日志,可以按照以下步骤操作: 首先登录到Oracle数据库的SQL*Plus命令行界面或者使用其他...
    99+
    2024-04-09
    oracle
  • 关于Feign的覆写默认配置和Feign的日志
    目录Feign的覆写默认配置Feign Logging 日志Feign进行日志配置Feign有四种类型的日志列出两种在项目中配置Feign日志的方法Feign的覆写默认配置 A ce...
    99+
    2024-04-02
  • ORACLE RMAN还原归档日志的方法是什么
    这篇文章主要介绍“ORACLE RMAN还原归档日志的方法是什么”,在日常操作中,相信很多人在ORACLE RMAN还原归档日志的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望...
    99+
    2024-04-02
  • 配置rman来自动删除应用过的归档日志
    Configure Rman to Purge Application standby logs. Posted on   March 26, 2011   by...
    99+
    2024-04-02
  • 在Java中使用日志框架log4j的方法
    日志就是记录程序的运行轨迹,方便快速定位问题 如果用System.out.println(),信息是打印在控制台。等到产品上线后没有控制台,如果有报错信息,根本不知道去哪里看,就不知...
    99+
    2024-04-02
  • SpringBoot集成slf4j日志配置的方法
    目录前言 1、slf4j概述 2、pom.xml的日志依赖 3、application.yml的日志配置 4、logback.xml配置文件定义 5、logback.xml配置文件解...
    99+
    2024-04-02
  • springboot配置日志的方法是什么
    在Spring Boot中配置日志有以下几种方法:1. 使用application.properties或application.y...
    99+
    2023-08-09
    springboot
  • Ubuntu系统日志配置 /var/log/messages的方法
    1. 问题描述 今天需要查看系统的日志文件,但却没有找到/var/log/messages这个文件。网上搜素资料pObmYuX,说是要配置/etc/syslog.conf。syslog采用可配置的、统一的系统登记程序,随...
    99+
    2022-06-04
    Ubuntu 日志配置 var log messages
  • SpringBoot接入轻量级分布式日志框架(GrayLog)的操作方法
    目录00、为什么需要分布式日志组件?01、轻量级ELK(Graylog)02、部署Graylog03、SpringBoot使用GrayLog04、懂点GrayLog05 、番外:Sw...
    99+
    2024-04-02
  • linux系统中修改tomcat默认输入日志路径的方法
    1、修改catalina.sh 进入tomcat安装目录/bin,找到catalina.sh,先进行备份。 对本地的catalina.sh进行修改,这里是以将日志目录修改为/data/logs为例,即将$CATALIN...
    99+
    2022-06-04
    linux tomcat默认路径 linux tomcat日志路径 linux tomcat 路径
  • Oracle 中常见的日志类型及配置方法
    Oracle 中常见的日志类型及配置方法 Oracle 数据库是业界领先的关系型数据库管理系统之一,它提供了丰富的日志类型来记录数据库的操作和性能信息。在实际的数据库管理工作中,了解并...
    99+
    2024-03-09
    oracle 配置 日志
  • linux日志服务器配置的方法是什么
    配置Linux日志服务器可以使用rsyslog工具,以下是配置方法: 安装rsyslog工具: sudo apt-get ins...
    99+
    2024-04-26
    linux 服务器
  • log4j配置按日期生成日志文件的方法是什么
    要按日期生成日志文件,可以使用log4j的DailyRollingFileAppender。它可以根据日期规则来生成新的日志文件。以...
    99+
    2023-09-13
    log4j
  • SpringBoot日志的配置及输出的方法是什么
    这篇文章主要介绍“SpringBoot日志的配置及输出的方法是什么”,在日常操作中,相信很多人在SpringBoot日志的配置及输出的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SpringBoo...
    99+
    2023-06-21
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作