go fiber: 把异常信息写到错误日志中

news/2024/11/16 12:49:03/文章来源:https://www.cnblogs.com/architectforest/p/18546745

一,代码:

1,userBusiness.go

package businessimport ("fmt")//得到多个用户,按分页返回
func GetUserList(page int ,pageSize int) (string,error) {b := 0a:=100/bfmt.Println(a)return "1,2,3",nil
}

代码中包含有除0错,会引发panic

2,userController.go

它用调用包含除0错的userBusiness

package controllerimport ("github.com/gofiber/fiber/v2"//"time""industry/business""fmt"
)type UserController struct{}func NewUserController() *UserController {return &UserController{}
}func (dc *UserController) ListUser(c *fiber.Ctx) error {// 处理列出用户的逻辑list,_:=business.GetUserList(1,30)fmt.Println(list)return c.SendString("列出用户")
}

3,recoverMiddleware.go

参考了fiber官方的recover类,添加了写日志功能

package middlewareimport ("fmt"//"os""runtime/debug""time""github.com/gofiber/fiber/v2""industry/config"
)//在中间件中得到panic,获取堆栈后写入到日志中
func NewRecover(c *fiber.Ctx) (err error) { //nolint:nonamedreturns // Uses recover() to overwrite the error// Catch panicsdefer func() {if r := recover(); r != nil {// fmt.Printf("panic: %v\n%s\n", r.(error), debug.Stack())timeStr:=time.Now().Format("2006-01-02 15:04:05")//得到时间,ip地址,请求的地址,参数,user-agent,fullURL := c.OriginalURL()   //urlclientIP := c.IP()    //ip地址method := c.Method() // 获取请求方法userAgent := c.Get("User-Agent")   //user agent// 获取所有查询参数queryParams := fmt.Sprintf("%v",c.Queries())fmt.Println("Query Params:", queryParams)filename:="/data/logs/gologs/exception-" + time.Now().Format("2006-01-02") + ".log"content:="["+timeStr+"] "+r.(error).Error()+"\n"+clientIP+" "+method+" "+fullURL+" "+userAgent+"\n"+queryParams+"\n"+string(debug.Stack())+"\n"config.GlobalWriteFile(filename,content)var ok boolif err, ok = r.(error); !ok {// Set error that will call the global error handlererr = fmt.Errorf("%v", r)}}}()// Return err if exist, else move to next handlerreturn c.Next()
}

 

4,routes.go

package routesimport ("github.com/gofiber/fiber/v2""industry/controller""runtime/debug""industry/middleware""fmt"
)func SetupRoutes() *fiber.App {app := fiber.New(fiber.Config{ErrorHandler: func(c *fiber.Ctx, err error) error {// 发送自定义错误页面//return c.Status(code).JSON(config.Error("内部错误:"+err.Error()))return c.SendString("内部错误:"+err.Error())},})app.Use(middleware.NewRecover)//用户模块userController := controller.NewUserController()user := app.Group("/user")user.Get("/info", userController.GetUser)user.Post("/", userController.CreateUser)user.Get("/list", userController.ListUser)return app
}

5,写日志的类:

package configimport ("os""fmt"
)// filename:文件路径,content:要写的内容
func GlobalWriteFile(filename,content string) error {// 输出到文件file, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)if err != nil {fmt.Println("日志文件的打开错误 : " + err.Error())return err}defer file.Close()if _, err := file.WriteString(content); err != nil {fmt.Println("写入日志文件错误 : " + err.Error())return err}return nil
}

 

二,测试效果:

[2024-11-14 17:56:51] runtime error: integer divide by zero
192.168.219.1 POST /user/list?token=111&a=22&c=33 PostmanRuntime/7.42.0
map[a:22 c:33 token:111]
goroutine 21 [running]:
runtime/debug.Stack()/usr/local/soft/go/src/runtime/debug/stack.go:26 +0x5e
industry/middleware.NewRecover.func1()/data/goapp/industry/middleware/recoverMiddleware.go:37 +0x29a
panic({0x6f9360?, 0xa08960?})/usr/local/soft/go/src/runtime/panic.go:785 +0x132
industry/business.GetUserList(0x7f008002000000?, 0xc00005ba80?)/data/goapp/industry/business/userBusiness.go:9 +0x9
industry/controller.(*UserController).ListUser(0x467edd?, 0xc00014e008)/data/goapp/industry/controller/userController.go:29 +0x26
github.com/gofiber/fiber/v2.(*App).next(0xc0000e4a08, 0xc00014e008)/data/gopath/pkg/mod/github.com/gofiber/fiber/v2@v2.52.5/router.go:145 +0x1be
github.com/gofiber/fiber/v2.(*Ctx).Next(0x10?)/data/gopath/pkg/mod/github.com/gofiber/fiber/v2@v2.52.5/ctx.go:1034 +0x4d
industry/middleware.NewRecover(0x6f65e0?)/data/goapp/industry/middleware/recoverMiddleware.go:50 +0x53
github.com/gofiber/fiber/v2.(*App).next(0xc0000e4a08, 0xc00014e008)/data/gopath/pkg/mod/github.com/gofiber/fiber/v2@v2.52.5/router.go:145 +0x1be
github.com/gofiber/fiber/v2.(*App).handler(0xc0000e4a08, 0x4adc0f?)/data/gopath/pkg/mod/github.com/gofiber/fiber/v2@v2.52.5/router.go:172 +0x69
github.com/valyala/fasthttp.(*Server).serveConn(0xc0000ec248, {0x7d3198, 0xc0000ac1e0})/data/gopath/pkg/mod/github.com/valyala/fasthttp@v1.57.0/server.go:2385 +0xed1
github.com/valyala/fasthttp.(*workerPool).workerFunc(0xc00011a090, 0xc0000e63a0)/data/gopath/pkg/mod/github.com/valyala/fasthttp@v1.57.0/workerpool.go:225 +0x92
github.com/valyala/fasthttp.(*workerPool).getCh.func1()/data/gopath/pkg/mod/github.com/valyala/fasthttp@v1.57.0/workerpool.go:197 +0x32
created by github.com/valyala/fasthttp.(*workerPool).getCh in goroutine 1/data/gopath/pkg/mod/github.com/valyala/fasthttp@v1.57.0/workerpool.go:196 +0x194

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/834566.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

golang: 在线上用nginx部署应用

一,启动应用: 1,编译程序 $ go build 2,用nohup启动应用的二进制程序 $ nohup /data/goapp/industry/industry >> /data/logs/gologs/back.log 2>&1 & [1] 4896 3,检查应用是否启动: $ ss -lntp | grep 3000 LISTEN 0 4096 0.0.0.0:3000 …

go fiber:路由中间件

一,目录结构:二,代码 1,中间件代码 package middlewareimport ("fmt""github.com/gofiber/fiber/v2""industry/config" )// token校验 func CheckUser(c *fiber.Ctx) error {token:=c.Query("token")fmt.Println("token:"…

20222327 2024-2025-1 《网络与系统攻防技术》实验六实验报告

一、实验内容 学习掌握了Metasploit工具的使用,具体的操作总结来说就是Search-Use-Show-Set-Exploit/run 学习了利用相关漏洞进行模拟攻击的操作,对防范恶意攻击有了一些认识(安装杀软,不要点击陌生网站、文件链接等) 二、实验过程 1、前期渗透 ①主机发现(可用Aux中的ar…

快速量产低功耗 4G 定位方案?Air201 模组来搞定!

今天我们来了解的是Air201模组快速量产低功耗 4G 定位方案,希望大家有所收获。今天我们来了解的是Air201模组快速量产低功耗 4G 定位方案,希望大家有所收获。 寻寻觅觅低功耗4G定位方案? 一个Air201就够了! ——定位准、体积小、功耗低,助力行业客户快速量产! 01 Air201是…

如何挑选海外4G模组?这里有秘籍!

今天我会告诉大家如何挑选海外4G模组,我会把优势给贴出作为参考。去过国外的都知道国外4G网络各种状况实在让人无力吐槽,做海外设备的朋友,是时候了解一下Air780EEN/EEU/EEJ系列海外模组——集成vSIM功能,最大程度解决海外联网稳定性的问题。今天我会告诉大家如何挑选海外4…

无线基础配置

所需配置 AC1 [AC6605]vlan batch 10 20 100 [AC6605]interface GigabitEthernet 0/0/1 [AC6605-GigabitEthernet0/0/1]port link-type trunk[AC6605-GigabitEthernet0/0/1]port trunk allow-pass vlan 10 20 100 [AC6605]interface Vlanif 100 [AC6605-Vlanif100]ip address 1…

基于YOLO实现滑块验证码破解

申明:本案例中的思路和技术仅用于学习交流。请勿用于非法行为。 一、训练模型 详细训练步骤和导出模型参考 滑块验证码识别模型训练 二、模型试用 通过YoloDotNet运行模型,计算出滑块缺口位置后用RESTful格式的接口返回坐标给其它应用调用。YoloDotNet案例参考 物体检测框架Y…

本地oracle数据库实例启动报错 TNS-12545 TNS-12560 TNS-00515

oracle 实例启动报错 TNS-12545 TNS-12560 TNS-00515 具体提示如下: 监听该对象时出错: (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host.docker.internal)(PORT=1521))) TNS-12545: 因目标主机或对象不存在, 连接失败 TNS-12560: TNS: 协议适配器错误 TNS-00515: 因目标主机…

jenkinsfile

k8s集群中用的jenkinsfile部署 java后台项目# x项目 test-java-eladmin-ci// harbor镜像仓库地址和密码信息 def registry = "harbor.solomon.com" // jenkins中定义的连接harbor的用户名密码凭据 def registry_se = "d2318c77-8a32-4618-bced-d6cabb0454b4&quo…

[网鼎杯 2018]Fakebook 1

[网鼎杯 2018]Fakebook 1 打开实例发现为博客列表,有登录跳转和类似注册或者添加博客的join跳转查看源码无果 打开登陆页,尝试万能密码没有用,尝试从join入手,用admin去随便join一个显示博客不存在 期间尝试多种sql注入方法均没有效果,转去其他方向 尝试dirsearch目录爆破…

【Adobe Premiere pro 2025下载与安装教程】

1、安装包「Adobe Premiere Pro 2025」: 链接:https://pan.quark.cn/s/e93beb96accb 提取码:CGY2 2、安装教程 1) 下载软件安装包,打开安装目录,双击Setup.exe安装,弹出安装对话框2) 选择安装目录,尽量不要选C盘,点击继续3) 等待安装过程完成,点…

人工智能同样也会读死书----“过拟合”

上一篇:《“嵌入”在大语言模型中是解决把句子转换成向量表示的技术》 序言:我们常常会说某某人只会“读死书”,题目稍微变一点就不会做了。这其实是我们人类学习中很常见的现象。可是你知道吗?人工智能其实更容易“读死书”。不过在人工智能领域,我们有个听起来高大上的说…