【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 mainimport ("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 mainimport ("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 mainimport ("github.com/gin-gonic/gin"
)func main() {router := gin.Default()router.GET("/ping")
}

接口創建測試

在 api 目錄下創建 user.go :

package apiimport "github.com/gin-gonic/gin"func GetUserList(ctx *gin.Context) {}

路由的配置

在 router 目錄下創建user模塊的路由:user.go:

package routerimport ("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 mainimport ("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 initializeimport ("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 mainimport ("fmt""go.uber.org/zap""mxshop-api/user-web/initialize"
)func main() {// 調用自己的 initlize 創建 RouterRouter := 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 initializeimport "go.uber.org/zap"func InitLogger() {// 若配置為 zap.NewDevelopment() 則為 開發環境級別的日志,其會打印 Debug、Info 的信息logger, _ := zap.NewProduction() // 配置為 NewProduction 視為 生產環境,不會打印 Debug 級別的日志zap.ReplaceGlobals(logger)
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/18754.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/18754.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/18754.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

excel導到access后長文本內容缺失

參考該文Excel表格如何導入Access數據庫以及列內容超過255個字符被截斷解決辦法 - 知乎 原因是access數據中列內容超過255個字符會被截斷。 解決方法:將該字段的數據類型修改為長文本即可。

微調真的能讓LLM學到新東西嗎:引入新知識可能讓模型產生更多的幻覺

大型語言模型(llm)是在巨大的文本語料庫上訓練的,在那里他們獲得了大量的事實知識。這些知識嵌入到它們的參數中,然后可以在需要時使用。這些模型的知識在培訓結束時被“具體化”。在預訓練結束時,模型實際上停止學習。 對模型進行對齊或進行…

【VTKExamples::Utilities】第十四期 Screenshot

很高興在雪易的CSDN遇見你 VTK技術愛好者 QQ:870202403 公眾號:VTK忠粉 前言 本文分享VTK樣例Screenshot,保存窗口快照,并解析接口vtkWindowToImageFilter,希望對各位小伙伴有所幫助! 感謝各位小伙伴的點贊+關注,小易會繼續努力分享,一起進步! 你的點贊就是…

SELINUX=enforcing時無法啟動httpd服務的解決方案(semanage命令以及setroubleshoot-server插件的妙用)

一、問題描述: 當/etc/selinux/conf被要求必須是SELINUXenforcing,不被允許使用setenforce 0寬松模式 我們啟動httpd就會報錯: Job for httpd.service failed because the control process exited with error code. See "systemctl s…

如何安裝ansible

ansible安裝 1、 準備環境----關閉防護墻和selinux 一般用ansible不會少于10臺以上 環境: 主機:4臺 一個控制節點 3個被控制節點 解析:本地互相解析(所有機器) # vim /etc/hosts 192.168.1.10 ansible-web1 192.168.1.11 ansible-web2 192.168.1.12…

重生之 SpringBoot3 入門保姆級學習(08、properties 和 yml 表示復雜對象)

重生之 SpringBoot3 入門保姆級學習(08、properties 和 yml 表示復雜對象) 2.5 yml 配置文件2.6 復雜對象用 properties 表示2.7 復雜對象用 yml 表示 2.5 yml 配置文件 application.properties 配置文件書寫形式 server.port9999spring.data.redis.hos…

Let‘s Encrypt 免費證書申請

填寫郵箱,申請的域名 單域名:www.example.com 泛域名: *.example.com yum -y install certbot sudo certbot certonly --server https://acme-v02.api.letsencrypt.org/directory --manual --preferred-challenges dns --email xxexample…

第23講:Ceph集群RBD塊存儲的離線備份與還原

文章目錄 1.RBD塊存儲的離線備份機制2.RBD塊存儲的備份導出操作2.1.為RBD塊存儲設備創建一個快照2.2.基于快照文件備份到本地系統2.3.基于塊設備備份到本地系統 3.RBD塊存儲的備份還原導入操作4.RBD塊存儲的增量備份與增量還原4.1.增量備份的操作4.2.增量備份的還原操作 1.RBD塊…

從零開始學React--環境搭建

React官網 快速入門 – React 中文文檔 1.搭建環境 下載nodejs,雙擊安裝 nodejs下載地址 更新npm npm install -g npm 設置npm源,加快下載速度 npm config set registry https://registry.npmmirror.com 創建一個react應用 npx create-react-app react-ba…

Nginx的配置與調試

目錄 1、安裝Nginx 2、Nginx的配置文件結構 2.1 Nginx的全局配置 2.2 HTTP服務器配置 2.3 HttpGzip模塊配置 2.4 負載均衡配置 2.5 server虛擬主機配置 2.6 location URL匹配配置 2.7 StubStatus模塊配置 1、安裝Nginx 在安裝Nginx之前,需確保系統已經安裝…

202303青少年軟件編程(Python)等級考試試卷(四級)

第 1 題 【單選題】 運行下列程序, 輸出的結果是? ( ) def wenhao(name = zhejiang):print(hello + name)wenhao()A :hello B :hellozhejiang C :helloname D :程序將提示運行錯誤 正確答案:B 試題解析: 定義函數時, 可以指定形參的默認值。 如果在調用函數時給函數…

SpringBoot如何使用日志Logback,及日志等級詳解

Spring Boot默認已經集成了SLF4J(Simple Logging Facade for Java)作為日志的接口,以及Logback作為日志的實現。這意味著在大多數情況下,你無需做額外的配置即可開始記錄日志。 下面是一個簡要的指南,包括如何在Spring…

豆瓣內容抓取:使用R、httr和XML庫的完整教程

概述 在數據分析和統計領域,R語言以其強大的數據處理能力和豐富的包庫資源而聞名。它不僅提供了一個靈活的編程環境,還擁有專門用于數據抓取和處理的工具,如httr和XML庫。這些工具使得從各種網站上抓取數據變得簡單而高效。 豆瓣網站作為一個…

Android環境下Mesa初始化流程重學習之eglCreateContext

Mesa初始化流程重學習之eglCreateContext 引言 沒有啥好說的了,直接上手擼代碼!總得找點事情干不是!我打工我快樂!我奮斗,我快樂! 一. 核心結構體之間的關聯 二. eglCreateContext流程分析 eglCreateContext(...)//s…

紅酒配餐中的酒杯選擇與使用技巧

在紅酒配餐中,酒杯的選擇與使用技巧是影響品鑒體驗的重要因素。合適的酒杯不僅能展現出紅酒的優雅和風味,還能提升用餐的儀式感和愉悅感。云倉酒莊雷盛紅酒以其卓著的品質和豐富的口感,成為了紅酒愛好者們的首要選擇品牌。下面將介紹在紅酒配…

21張讓你代碼能力突飛猛進Python速查表(神經網絡、線性代數、可視化等)(有中文版)

隨著深度學習的蓬勃發展,越來越多的小伙伴們開始使用python作為主打代碼,python有著種類繁多的第三方庫,這里為大家從網絡上收集了一些代碼速查表,希望可以幫你在碼代碼時提速。 基礎 神經網絡 線性代數 Python資料 可以去VX公…

python標準庫argparse,腳本傳參

argparse 是 Python 的標準庫之一,它用于編寫用戶友好的命令行接口。通過 argparse,你可以很容易地為你的 Python 腳本添加命令行參數和選項,并解析它們。下面是一個簡單的介紹和示例 # 導入庫 import argparse# 定義命令行解析器對象 parse…

JavaScript 日期和時間的格式化

JavaScript 日期和時間的格式化 一、日期和時間的格式化 1、原生方法 1.1、使用 toLocaleString 方法 Date 對象有一個 toLocaleString 方法,該方法可以根據本地時間和地區設置格式化日期時間。例如: const date new Date(); console.log(date.toL…

buuctf_RE

[WMCTF2020]easy_re 簡單輸入flag 但是下斷點后,還沒走幾步就報錯退出了。 確實沒有打印的字符串 main函數也看不懂在干嘛 int __cdecl main(int argc, const char **argv, const char **envp) {__int64 v4; // r13char v5; // r12__int64 v6; // rax_QWORD *v7;…

python計算開始時間到結束時間步長一個小時

為了計算從開始時間到結束時間,每隔一小時的時間間隔,你可以使用Python的datetime模塊來處理日期和時間。以下是一個簡單的例子,它生成從開始時間到結束時間每隔一小時的時間列表。 from datetime import datetime, timedelta# 開始時間 sta…