go语言day20 使用gin框架获取参数 使用自定义的logger记录日志
Golang 操作 Logger、Zap Logger 日志_golang zap-CSDN博客
目录
一、 从控制器中获取参数的几种形式
1) 页面请求url直接拼接参数。
2) 页面请求提交form表单
3) 页面请求发送json数据,使用上下文对象c的BindJSON()方法接收数据
4) 页面请求发送json数据,使用相应小写字段 结构体对象接收值。
二、使用自定义的logger记录日志文件
1)创建 自定义的logger.go文件
2)使用自定义logger
1) 在common.go中文件写入logger.SimpleHttpGet() :
2)直接在路由请求调用的函数中写入logger.SimpleHttpGet()
三) 再次自定义logger
使用自定义logger函数
一、 从控制器中获取参数的几种形式
1) 页面请求url直接拼接参数。
2) 页面请求提交form表单
3) 页面请求发送json数据,使用上下文对象c的BindJSON()方法接收数据
4) 页面请求发送json数据,使用相应小写字段 结构体对象接收值。
二、使用自定义的logger记录日志文件
1)创建 自定义的logger.go文件
package loggerimport ("net/http""github.com/natefinch/lumberjack""go.uber.org/zap""go.uber.org/zap/zapcore" )var sugarLogger *zap.SugaredLogger//func main() { // InitLogger() // defer sugarLogger.Sync() // simpleHttpGet("https://www.baidu.com") // simpleHttpGet("https://c.runoob.com") //}func InitLogger() {writeSyncer := getLogWriter()encoder := getEncoder()core := zapcore.NewCore(encoder, writeSyncer, zapcore.DebugLevel)logger := zap.New(core)sugarLogger = logger.Sugar() }// func getEncoder() zapcore.Encoder { // return zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()) // return zapcore.NewConsoleEncoder(zap.NewProductionEncoderConfig()) // }func getEncoder() zapcore.Encoder {encoderConfig := zap.NewProductionEncoderConfig()encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoderencoderConfig.EncodeLevel = zapcore.CapitalLevelEncoderreturn zapcore.NewConsoleEncoder(encoderConfig) }// func getLogWriter() zapcore.WriteSyncer { //如果想要追加写入可以查看我的博客文件操作那一章 // file, _ := os.Create("./test.log") // return zapcore.AddSync(file) // }func getLogWriter() zapcore.WriteSyncer {lumberJackLogger := &lumberjack.Logger{Filename: "./test.log",MaxSize: 1,MaxBackups: 5,MaxAge: 30,Compress: false,}return zapcore.AddSync(lumberJackLogger) }func SimpleHttpGet(url string) {sugarLogger.Debugf("Trying to hit GET request for %s", url)resp, err := http.Get(url)if err != nil {sugarLogger.Errorf("Error fetching URL %s : Error = %s", url, err)} else {sugarLogger.Infof("Success! statusCode = %s for URL %s", resp.Status, url)resp.Body.Close()} }
2)使用自定义logger
1) 在common.go中文件写入logger.SimpleHttpGet() :
每个url请求调用的函数最终调同到ReturnSuccess()函数
logger.InitLogger()logger.SimpleHttpGet(c.Request.URL.Path)
2)直接在路由请求调用的函数中写入logger.SimpleHttpGet()
三) 再次自定义logger
package loggerimport ("fmt""github.com/gin-gonic/gin""github.com/sirupsen/logrus""io""net/http""os""path""runtime/debug""time"
)func init() {// 设置日志格式为json格式logrus.SetFormatter(&logrus.JSONFormatter{TimestampFormat: "2006-01-02 15:04:05",})logrus.SetReportCaller(false)
}func Write(msg string, filename string) {setOutPutFile(logrus.InfoLevel, filename)logrus.Info(msg)
}func Debug(fields logrus.Fields, args ...interface{}) {setOutPutFile(logrus.DebugLevel, "debug")logrus.WithFields(fields).Debug(args)
}func Info(fields logrus.Fields, args ...interface{}) {setOutPutFile(logrus.InfoLevel, "info")logrus.WithFields(fields).Info(args)
}func Warn(fields logrus.Fields, args ...interface{}) {setOutPutFile(logrus.WarnLevel, "warn")logrus.WithFields(fields).Warn(args)
}func Fatal(fields logrus.Fields, args ...interface{}) {setOutPutFile(logrus.FatalLevel, "fatal")logrus.WithFields(fields).Fatal(args)
}func Error(fields logrus.Fields, args ...interface{}) {setOutPutFile(logrus.ErrorLevel, "error")logrus.WithFields(fields).Error(args)
}func Panic(fields logrus.Fields, args ...interface{}) {setOutPutFile(logrus.PanicLevel, "panic")logrus.WithFields(fields).Panic(args)
}func Trace(fields logrus.Fields, args ...interface{}) {setOutPutFile(logrus.TraceLevel, "trace")logrus.WithFields(fields).Trace(args)
}func setOutPutFile(level logrus.Level, logName string) {if _, err := os.Stat("./runtime/log"); os.IsNotExist(err) {err = os.MkdirAll("./runtime/log", 0777)if err != nil {panic(fmt.Errorf("create log dir '%s' error: %s", "./runtime/log", err))}}timeStr := time.Now().Format("2006-01-02")fileName := path.Join("./runtime/log", logName+"_"+timeStr+".log")var err erroros.Stderr, err = os.OpenFile(fileName, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0644)if err != nil {fmt.Println("open log file err", err)}logrus.SetOutput(os.Stderr)logrus.SetLevel(level)return
}func LoggerToFile() gin.LoggerConfig {if _, err := os.Stat("./runtime/log"); os.IsNotExist(err) {err = os.MkdirAll("./runtime/log", 0777)if err != nil {panic(fmt.Errorf("create log dir '%s' error: %s", "./runtime/log", err))}}timeStr := time.Now().Format("2006-01-02")fileName := path.Join("./runtime/log", "success_"+timeStr+".log")os.Stderr, _ = os.OpenFile(fileName, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0644)var conf = gin.LoggerConfig{Formatter: func(param gin.LogFormatterParams) string {return fmt.Sprintf("%s - %s \"%s %s %s %d %s \"%s\" %s\"\n",param.TimeStamp.Format("2006-01-02 15:04:05"),param.ClientIP,param.Method,param.Path,param.Request.Proto,param.StatusCode,param.Latency,param.Request.UserAgent(),param.ErrorMessage,)},Output: io.MultiWriter(os.Stdout, os.Stderr),}return conf
}func Recover(c *gin.Context) {defer func() {if err := recover(); err != nil {if _, errDir := os.Stat("./runtime/log"); os.IsNotExist(errDir) {errDir = os.MkdirAll("./runtime/log", 0777)if errDir != nil {panic(fmt.Errorf("create log dir '%s' error: %s", "./runtime/log", errDir))}}timeStr := time.Now().Format("2006-01-02")fileName := path.Join("./runtime/log", "error_"+timeStr+".log")f, errFile := os.OpenFile(fileName, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0644)if errFile != nil {fmt.Println(errFile)}timeFileStr := time.Now().Format("2006-01-02 15:04:05")f.WriteString("panic error time:" + timeFileStr + "\n")f.WriteString(fmt.Sprintf("%v", err) + "\n")f.WriteString("stacktrace from panic:" + string(debug.Stack()) + "\n")f.Close()c.JSON(http.StatusOK, gin.H{"code": 500,"msg": fmt.Sprintf("%v", err),})//终止后续接口调用,不加的话recover到异常后,还会继续执行接口里后续代码c.Abort()}}()c.Next()
}
使用自定义logger函数


相关文章:
go语言day20 使用gin框架获取参数 使用自定义的logger记录日志
Golang 操作 Logger、Zap Logger 日志_golang zap-CSDN博客 目录 一、 从控制器中获取参数的几种形式 1) 页面请求url直接拼接参数。 2) 页面请求提交form表单 3) 页面请求发送json数据,使用上下文对象c的BindJSON()方法接…...
DHCP笔记
DHCP---动态主机配置协议 作用:为终端动态提供IP地址,子网掩码,网关,DNS网址等信息 具体流程 报文抓包 在DHCP服务器分配iP地址之间会进行广播发送arp报文,接收IP地址的设备也会发送,防止其他设备已经使用…...
TCP为什么需要四次挥手?
tcp为什么需要四次挥手? 答案有两个: 1.将发送fin包的权限交给被动断开发的应用层去处理,也就是让程序员处理 2.接第一个答案,应用层有了发送fin的权限,可以在发送fin前继续向对端发送消息 为了搞清楚这个问题&…...
MySQL 索引相关基本概念
文章目录 前言一. B Tree 索引1. 概念2. 聚集索引/聚簇索引3. 辅助索引/二级索引4. 回表5. 联合索引/复合索引6. 覆盖索引 二. 哈希索引三. 全文索引 前言 InnoDB存储引擎支持以下几种常见索引:BTree索引,哈希索引,全文索引 一. B Tree 索引…...
Neutralinojs教程项目实战初体验(踩坑指南),干翻 electron
Neutralinojs 项目实战初体验(踩坑指南),干翻 electron Neutralinojs 官方文档 卧槽卧槽,!这个年轻人居然用浏览器把电脑关机了_哔哩哔哩_bilibili正是在下 本教程搭建的是纯原生项目,没有和其它前端框架…...
【轻松拿捏】Java-List、Set、Map 之间的区别是什么?
List、Set、Map 之间的区别是什么? 一、List 二、Set 三、Map 🎈边走、边悟🎈迟早会好 一、List 有序性:List 保持元素的插入顺序,即元素按添加的顺序存储和访问。允许重复:List 可以包含重复的元素。…...
用户史订单查询业务
文章目录 概要整体架构流程技术细节小结 概要 在电商、金融、物流等行业中,用户历史订单查询是一项常见的业务需求。这项功能允许用户查看他们过去的交易记录,包括但不限于购买的商品、服务详情、交易金额、支付状态、配送信息等。对于企业而言…...
第8节课:CSS布局与样式——掌握盒模型与定位的艺术
目录 盒模型:网页布局的基础盒模型的属性盒模型的示例 定位:控制元素位置定位的类型定位的示例 实践:使用CSS布局创建响应式网页结语 CSS布局是网页设计中的基石,它决定了网页元素的排列和分布。盒模型和定位是CSS布局中的两个核心…...
electron 主进程和渲染进程
最近在整理electron 相关的项目问题,对自己来说也是温故知新,也希望能对小伙伴们有所帮助,大家共同努力共同进步。加油!!!! 虽然最近一年前端大环境不好,但是大家还是要加油鸭&#…...
redis的高可用及性能管理和雪崩
redis的高可用 redis当中,高可用概念更宽泛一些。 除了正常服务以外,数据量的扩容,数据安全。 实现高可用的方式: 1、持久化 最简单的高可用方法,主要功能就是备份数据。 把内存当中的数据保存到硬盘当中。 2、主…...
php基础语法
文章目录 1. PHP(1) 安装php 2. 基础语法(1) 格式(2) 输出语法(3) 注释(4) 变量(无变量类型自动识别)(5) 输入获取(6) 定界符(7) 换行 3. 基本数据类型(1) 字符串(2) 整数(3). 浮点数(4). boolean类型(5). 数组(6). null值 4. 运算符(1) 算术运算符(2) 比较运算符(3) 逻辑运算符…...
js抓取短信验证码发送
油猴(Tampermonkey)是一个流行的浏览器扩展,它允许用户在浏览器中运行自定义的JavaScript脚本。下面是一个简单的示例脚本,用于收集网站上发送短信验证码的API请求,并以JSON格式存储这些信息。请注意,这个脚本需要根据实际网站的API请求进行调整,因为不同的网站可能有不…...
视频怎么加密?常见的四种视频加密方法和软件
视频加密是一种重要的技术手段,用于保护视频内容不被未经授权的用户获取、复制、修改或传播。在加密过程中,安企神软件作为一种专业的加密工具,可以发挥重要作用。 以下将详细介绍如何使用安企神软件对视频进行加密,并探讨视频加密…...
聚焦全局应用可用性的提升策略,详解GLSB是什么
伴随互联网的快速发展和全球化趋势的深入,企业对网络应用的需求日渐增长。为满足全球范围内用户大量的访问需求,同时解决容灾、用户就近访问以及全球应用交付等问题,GLSB(全局负载均衡)也因此应运而生。那么GLSB是什么…...
无水印下载视频2——基于tkinter完成头条视频的下载
在数字化时代的浪潮中,视频内容以其丰富性和便捷性,逐渐成为了我们获取信息和娱乐的重要途径。尤其是在短视频平台上,各种创意十足、内容精彩的视频层出不穷,更是吸引了数以亿计的用户。然而,随着视频内容的增加&#…...
Java学习Day17:基础篇7
继承 Java中的继承是面向对象编程中的一个核心概念,它允许我们定义一个类(称为子类或派生类)来继承另一个类(称为父类或基类)的属性和方法。继承提高了代码的复用性,使得我们不必从头开始编写所有的代码&a…...
Vue3 Pinia的创建与使用代替Vuex 全局数据共享 同步异步
介绍 提供跨组件和页面的共享状态能力,作为Vuex的替代品,专为Vue3设计的状态管理库。 Vuex:在Vuex中,更改状态必须通过Mutation或Action完成,手动触发更新。Pinia:Pinia的状态是响应式的,当状…...
手撕数据结构02--二分搜索(附源码)
一、理论基础 二分搜索,也称折半搜索、对数搜索,是一种在有序数组中查找某一特定元素的搜索算法。 二分搜索是一种高效的查找算法,适用于在已排序的数组中查找特定元素。它的基本思想是通过不断将搜索区间对半分割,从而快速缩小…...
单片机工程师继续从事硬件设计还是涉足 Linux 开发?
在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「linux的资料从专业入门到高级教程」,点个关注在评论区回复“666”之后私信回复“666”,全部无偿共享给大家!!! 怎么说呢,感觉绝…...
《昇思25天学习打卡营第25天|第28天》
今天是打卡的第二十八天,实践应用篇中的计算机视觉中Vision Transformer图像分类。 从Vision Transformer(ViT)简介开始了解,模型结构,模型特点,实验的环境准备和数据读取,模型解析(…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...







