【Go】十、路由配置以及ZAP 高性能日志库的使用

Project

目录创建

mxshop-api

user-web

api ---- 服务接口

config ---- 配置信息

forms ---- 表单验证信息

global ---- 全局信息

initialize ---- 初始化信息

middlewares ---- 中间件信息

proto ---- 数据信息

router ---- 路由信息

utils ---- 公用工具信息

validator ---- 表单校验器

ZAP 高性能日志库

ZAP 是 urban 开源的高性能日志库

ZAP 日志的简单使用

ZAP 日志框架有 sugar 模式以及 logger 模式两种,sugar 有更加便捷的使用方式,但会在一定程度上降低性能,logger则正好相反。但是,无论是 sugar 模式 还是logger传统模式,其性能都要比其他日志库的性能高很多。

package main

import (
	"go.uber.org/zap"
)

func main() {
	logger, _ := zap.NewProduction()
	defer logger.Sync()
	url := "http://test.com"

	// 开启 sugar 模式,这种模式会给予极简便的日志打印方式,但会在一定程度上降低效率
	// 我们可以不使用 Sugar ,直接进行 logger,这样会得到极致的性能
	sugar := logger.Sugar()

	// 使用 sugar 格式进行输出(利用了反射机制)
	sugar.Infow("This is my msg", "url", url, "attempt", 3)
	sugar.Infof("This is my msg %s", url)

	// 使用 logger 进行打印,和 Sugar 有相同效果,在添加 JSON 时会略微麻烦
	logger.Info("This is my msg", zap.String("url", url))
}

如何将日志输出到文件中

package main

import (
	"go.uber.org/zap"
	"time"
)

func NewLogger() (*zap.Logger, error) {
	cfg := zap.NewProductionConfig()
	cfg.OutputPaths = []string{
		"./myproject.log", // 日志输出,若只有这一个则只输出日志,默认不配置的话会使用控制台输出
		"stderr",          // 本地控制台输出,错误的红色
		"stdout",          // 本地控制台输出,输出常规的黑色
	}
	return cfg.Build()
}

func main() {
	logger, err := NewLogger()
	if err != nil {
		panic(err)
	}
	su := logger.Sugar()
	defer su.Sync()

	url := "https://6555555555555555.com"
	su.Info("failed to fetch URL",
		zap.String("url", url),
		zap.Int("attempt", 3),
		zap.Duration("backoff", time.Second), // 持续时间?
	)
}

基础操作的创建流程

main文件的创建

在主文件夹 user-web 下创建一个 main.go,配置基础的 gin 框架信息

package main

import (
	"github.com/gin-gonic/gin"
)

func main() {
	router := gin.Default()
	router.GET("/ping")
}

接口创建测试

在 api 目录下创建 user.go :

package api

import "github.com/gin-gonic/gin"

func GetUserList(ctx *gin.Context) {
	
}

路由的配置

在 router 目录下创建user模块的路由:user.go:

package router

import (
	"github.com/gin-gonic/gin"
	"mxshop-api/user-web/api"
)

func InitUserRouter(Router *gin.RouterGroup) {
	// 这样就需要 /user/list 才可以进行访问了
	UserRouter := Router.Group("user")
	{
		UserRouter.GET("list", api.GetUserList)
	}
}

将路由配置到 main 中

package main

import (
	"github.com/gin-gonic/gin"

	router2 "mxshop-api/user-web/router"
)

func main() {
	router := gin.Default()
	ApiGroup := router.Group("/v1")
	router2.InitUserRouter(ApiGroup)
}

将 配置Router和Logger的初始化工作交给 Initialize 做

在 Initialize 目录下创建一个 router.go:

并将创建 router 相关的工作交给 initialize去做,而不在 main 中做

package initialize

import (
	"github.com/gin-gonic/gin"
	router2 "mxshop-api/user-web/router"
)

func Routers() *gin.Engine {
	Router := gin.Default()

	ApiGroup := Router.Group("/v1")
	router2.InitUserRouter(ApiGroup)
	return Router
}

在 main 中调用这个 Routers 函数用于创建 gin 以及路由

package main

import (
	"fmt"
	"go.uber.org/zap"
	"mxshop-api/user-web/initialize"
)

func main() {
	// 调用自己的 initlize 创建 Router
	Router := initialize.Routers()
	port := 8021

	// 若配置为 zap.NewDevelopment() 则为 开发环境级别的日志,其会打印 Debug、Info 的信息
	logger, _ := zap.NewProduction() // 配置为 NewProduction 视为 生产环境,不会打印 Debug 级别的日志
	zap.ReplaceGlobals(logger)
	// 打印日志
	// 这里的 S() 和 L() 方法的主要用途是:在底层创建安全的日志情况,否则我们自己写的话需要自己考虑加锁的问题
	zap.L().Info(fmt.Sprintf("启动服务器,端口:%d", port))

	if err := Router.Run(fmt.Sprintf(":%d", port)); err != nil {
		zap.L().Panic("启动失败:", zap.Error(err))
	}

}

另外的,我们的日志也可以交给 Initialize做:

Initialize/logger.go

package initialize

import "go.uber.org/zap"

func InitLogger() {
	// 若配置为 zap.NewDevelopment() 则为 开发环境级别的日志,其会打印 Debug、Info 的信息
	logger, _ := zap.NewProduction() // 配置为 NewProduction 视为 生产环境,不会打印 Debug 级别的日志
	zap.ReplaceGlobals(logger)
}
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值