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

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函数

http://www.lryc.cn/news/410024.html

相关文章:

  • DHCP笔记
  • TCP为什么需要四次挥手?
  • MySQL 索引相关基本概念
  • Neutralinojs教程项目实战初体验(踩坑指南),干翻 electron
  • 【轻松拿捏】Java-List、Set、Map 之间的区别是什么?
  • 用户史订单查询业务
  • 第8节课:CSS布局与样式——掌握盒模型与定位的艺术
  • electron 主进程和渲染进程
  • redis的高可用及性能管理和雪崩
  • php基础语法
  • js抓取短信验证码发送
  • 视频怎么加密?常见的四种视频加密方法和软件
  • 聚焦全局应用可用性的提升策略,详解GLSB是什么
  • 无水印下载视频2——基于tkinter完成头条视频的下载
  • Java学习Day17:基础篇7
  • Vue3 Pinia的创建与使用代替Vuex 全局数据共享 同步异步
  • 手撕数据结构02--二分搜索(附源码)
  • 单片机工程师继续从事硬件设计还是涉足 Linux 开发?
  • 《昇思25天学习打卡营第25天|第28天》
  • Flutter Dio网络请求报错FormatException: Unexpected character
  • 关于@JsonSerialize序列化与@JsonDeserialize反序列化注解的使用(密码加密与解密举例)
  • 第二届世界科学智能大赛逻辑推理赛道:复杂推理能力评估 #大模型技术之逻辑推理方向 #Datawhale #夏令营 <二>
  • C# 关于Linq延迟查询
  • Navicat For Mysql连接Mysql8.0报错:客户端不支持服务器请求的身份验证协议
  • 以西门子winCC为代表的组态界面,还是有很大提升空间的。
  • HomeServer平台选择,介绍常用功能
  • 记录一个k8s集群zookeeper部署过程
  • TapData 信创数据源 | 国产信创数据库 TiDB 数据迁移指南,加速国产化进程,推进自主创新建设
  • 开始写人工智能
  • 盘点.软件测试模型