当前位置: 首页 > news >正文

个人做广播网站需要注意什么电子信息工程移动互联网方向

个人做广播网站需要注意什么,电子信息工程移动互联网方向,郑州网站建设小程序,湖南岳阳网站开发网络公司本文介绍在 Golang 的 gin 框架中使用自定义日志模块的一些方法。 背景 很早之前就实现并使用了自己封装的日志模块#xff0c;但一直没有将gin框架内部的日志和日志模块结合。gin的日志都是在终端上打印的#xff0c;排查问题不方便。趁五一假期#xff0c;集中研究把此事…本文介绍在 Golang 的 gin 框架中使用自定义日志模块的一些方法。 背景 很早之前就实现并使用了自己封装的日志模块但一直没有将gin框架内部的日志和日志模块结合。gin的日志都是在终端上打印的排查问题不方便。趁五一假期集中研究把此事了了。 实践 gin支持中间件对于一些常用接口也提供了自定义函数。本文主要是从这2方面着手。 据官方demo在初始化时基本都使用如下语句初始化内部日志Logger()和panic恢复功能Recovery()。 router.Use(gin.Logger()) router.Use(gin.Recovery())默认输出日志 [GIN] 2024/05/08 - 09:09:13 | 200 | 1.082244ms | ::1 | GET /info自定义Writer gin对外提供了DefaultWriter类型为io.Writer默认输出终端定义如下 var DefaultWriter io.Writer os.Stdout因此可以修改该参数达到自定义输出日志的目的。代码如下 f, _ : os.OpenFile(filepath.Join(./, gin.log), os.O_RDWR|os.O_APPEND|os.O_CREATE, 0666) gin.DefaultWriter io.MultiWriter(f)上述代码在当前目录创建gin.log文件将gin的日志输出到该文件效果如下 [GIN] 2024/05/08 - 09:10:54 | 200 | 844.357µs | ::1 | GET /info评自由度不够。 使用中间件 调用语句router.Use(gin.Logger())中的gin.Logger()实际可理解为中间件函数。函数定义 func XXX() HandlerFunc { ... }type HandlerFunc func(*Context)自定义的中间件函数模板 func XXXs() gin.HandlerFunc {return func(c *gin.Context) { ...// 下一处理c.Next() ...} }日志中间件实现如下 func filterLogs() gin.HandlerFunc {return func(c *gin.Context) {// Start timerstart : time.Now()path : c.Request.URL.Path// Process requestc.Next()// Stop timerlatency : time.Now().Sub(start)clientIP : c.ClientIP()method : c.Request.MethodstatusCode : c.Writer.Status()klog.Printf(middleware | %3d | %13v | %15s | %-7s %#v\n, statusCode, latency,clientIP, method, path)} }调用 router.Use(filterLogs())注klog.Printf为自封装的日志模块输出函数。源码可参考klog项目。 效果如下 [2024-05-08 09:44:34 515] [INFO] middleware | 404 | 738ns | ::1 | GET /info评参数gin框架的日志中间件实现简洁版本自由度较大。可在此函数中再做其它处理。如统计某path的次数等。 使用日志格式化回调函数 gin中自带了日志格式化的函数LoggerWithFormatter该函数参数为函数原型为type LogFormatter func(params LogFormatterParams) string。其本意是可以自定义输出的日志的字段内容因此返回值为字符串默认输出还是使用gin.DefaultWriter。 因此可以在该函数中添加日志的打印但不返回字符串这样gin框架就不会输出日志了。代码如下 router.Use(gin.LoggerWithFormatter(func(param gin.LogFormatterParams) string {klog.Printf(| %3d | %13v | %15s | %-7s %#v\n%s, param.StatusCode, param.Latency,param.ClientIP, param.Method, param.Path, param.ErrorMessage)return }))效果如下 [2024-05-08 09:44:34 516] [INFO] | 200 | 1.580895ms | ::1 | GET /info评利用现有的中间件自实现部分代码较简洁。可在此函数中再做其它处理。如统计某path的次数等。 Recovery中间件实现 gin框架默认的Recovery处理函数gin.Recovery()。与上类似输出信息也是使用内部日志模块的。为保存可能出现的panic信息因此需要重新实现。由于原代码已经很完备只是日志与需求不符因此并无大改具体代码如下 // panic日志记录 替换gin的Recovery函数 func filterRecovery() 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}}}stack : com.GetStack(3)httpRequest, _ : httputil.DumpRequest(c.Request, false)headers : strings.Split(string(httpRequest), \r\n)for idx, header : range headers {current : strings.Split(header, :)if current[0] Authorization {headers[idx] current[0] : *}}headersToStr : strings.Join(headers, \r\n)if brokenPipe {klog.Printf(%s\n%s, err, headersToStr)} else {klog.Printf([Recovery] panic recovered:\n%s\n%s, err, stack)}if brokenPipe {// If the connection is dead, we cant write a status to it.c.Error(err.(error)) // nolint: errcheckc.Abort()}}}()c.Next()} }使用 router.Use(filterRecovery())小结 本文介绍的几种方法基本上都可达到使用自定义日志的目的。笔者实际工程中使用中间件形式可定制性较高。 附gin框架日志源码跟踪 外部使用router.Use(gin.Logger()) -- LoggerWithConfig-- 如未指定formatter则用defaultLogFormatter-- 如未指定日志输出Write则用DefaultWriter-- 记录无需要输出的path存放于skip-- 有请求遍历skip如找不到则组装LogFormatterParams使用fmt.Fprint输出日志。从上述流程可以看出可以通过指定formatter在框架里内嵌自定义的函数由于会调用fmt.Fprint因此formatter不返回字符串。当然可实现自己的中间件替换gin.Logger()。
http://www.hkea.cn/news/14537771/

相关文章:

  • 建交易网站需要多少钱如何评估网站
  • 门户网站建设需求海外网站加速
  • 虞城县住房和城乡建设局网站wordpress制作相册
  • 网站 html5昆明专业网站建设模板
  • 经典网站案例网站需要的栏目和内容
  • 使用中文域名的网站国外网站建设视频教学
  • 国外设计网站door网页小游戏在线玩儿
  • 用php制作一个个人信息网站网站建设方案优化
  • 300网站建设小猫mip网站建设
  • 常州好一点的网站建设高端网站建设济南兴田德润简介电话
  • 专业做网站设计海外分销平台
  • 郴州网站建设专业定制要看网的域名是多少
  • 服务好的高端网站建设企业2023网络舆情案例分析
  • 服务器外面打不开网站凡科网页版登陆入口
  • .net和php哪个做网站好网站流量分析报告
  • 网站验收时项目建设总结报告机加工接单什么平台好
  • 做网站产品图片素材网站开发详细设计模板
  • 网站设计网页设计公司时尚网站模板代码
  • 怎么建设一个公司网站如何设置免费网站
  • 企业公司网站模版二次开发需要源代码吗
  • 常州做网站公司网站开发价格报表模板
  • 做动感影集的网站大连市建设厅网站
  • 网站建站方式网站的flash怎么做
  • 临海商用高端网站设计新感觉建站山西省建设厅招标网站
  • 榆林市横山县建设局官方网站福田欧曼自卸车
  • 网站建设 国家技术规范网站可行性分析
  • 做网做网站建设wordpress多语言企业网站
  • 做网站可以抄袭别人吗wordpress防止数据库注入
  • 网站建设公司类型公司基本资料模板
  • 安徽省交通运输厅门户网站网站地址查询网