申請網(wǎng)站怎樣申請自己店怎么弄到小程序上
鶴壁市浩天電氣有限公司
2026/01/24 10:16:06
申請網(wǎng)站怎樣申請,自己店怎么弄到小程序上,求個網(wǎng)站急急急,優(yōu)惠券網(wǎng)站做淘客違規(guī)嗎文章目錄1. Gin內(nèi)置日志中間件1.1. 默認日志中間件1.2. 禁用debug日志1.3. 控制日志顏色1.4. 自定義日志中間件1.4.1. 日志配置項1.4.2. 自定義方法1.4.3. 自定義日志格式示例1.4.4. 自定義日志輸出位置示例2. 集成第三方日志插件2.1. 集成 logrus2.2 集成 zap在開發(fā)Web應用時日志記錄是不可或缺的一部分。它不僅幫助開發(fā)者調(diào)試和排查問題還能用于監(jiān)控應用運行狀態(tài)、分析性能和用戶行為。Gin框架提供了靈活的日志記錄機制既包含內(nèi)置的日志中間件也支持自定義日志記錄方式。1. Gin內(nèi)置日志中間件Gin框架內(nèi)置了日志中間件它們記錄HTTP請求的基本信息。1.1. 默認日志中間件gin.Default()默認使用了gin.Logger()中間件。funcDefault(opts...OptionFunc)*Engine{debugPrintWARNINGDefault()engine:New()engine.Use(Logger(),Recovery())// 默認使用了gin.Logger()中間件returnengine.With(opts...)}輸出格式類似[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached. [GIN-debug] [WARNING] Running in debug mode. Switch to release mode in production. - using env: export GIN_MODErelease - using code: gin.SetMode(gin.ReleaseMode) [GIN-debug] GET /test/ping -- gin-quickstart/handler.TestHello (5 handlers) [GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value. Please check https://github.com/gin-gonic/gin/blob/master/docs/doc.md#dont-trust-all-proxies for details. [GIN-debug] Environment variable PORT is undefined. Using port :8080 by default [GIN-debug] Listening and serving HTTP on :8080 [GIN] 2025/12/29 - 15:40:59 | 200 | 256.625μs | 127.0.0.1 | GET /test/ping1.2. 禁用debug日志gin框架默認使用Debug模式所以上面的示例中會有很多GIN-debug日志。如果不想打印這些日志可以將gin模式改為生產(chǎn)模式gin.SetMode(gin.ReleaseMode)// 指定為生產(chǎn)模式router:gin.Default()日志示例[GIN]2025/12/29-15:44:41|200|320.666μs|127.0.0.1|GET/test/ping可以看到GIN-debug日志都消失了1.3. 控制日志顏色根據(jù)檢測到的 TTY控制臺的日志輸出默認是有顏色的。我們可以使用以下兩個方法來控制日志的顏色顯示gin.DisableConsoleColor()禁用顏色打印。gin.ForceConsoleColor()強制顏色打印。// 禁用顏色打印gin.DisableConsoleColor()router:gin.Default()// 強制顏色打印gin.ForceConsoleColor()router:gin.Default()1.4. 自定義日志中間件1.4.1. 日志配置項gin框架底層使用gin.LoggerConfig來配置日志中間件。// LoggerConfig 定義日志中間件的配置typeLoggerConfigstruct{// 格式化方法默認為gin.defaultLogFormatterFormatter LogFormatter// 日志輸出位置默認為gin.DefaultWriterOutput io.Writer// 不輸出日志的URL路徑SkipPaths[]string// 自定義方法用于判斷哪些日志不需要輸出Skip Skipper}默認的gin.Logger()中間件源碼如下funcLogger()HandlerFunc{returnLoggerWithConfig(LoggerConfig{})}從源碼看到該日志中間件使用的是默認配置格式化方法為gin.defaultLogFormatter。日志輸出位置為gin.DefaultWriter。沒有不需要輸出日志的路由路徑。1.4.2. 自定義方法gin框架提供了如下幾個方法供我們自定義日志中間件gin.LoggerWithConfig(conf LoggerConfig)最靈活的自定義方法支持直接使用gin.LoggerConfig配置項來靈活自定義日志中間件。gin.LoggerWithFormatter(f LogFormatter)自定義日志格式化方法控制日志輸出格式。gin.LoggerWithWriter(out io.Writer, notlogged ...string)自定義日志輸出位置以及不需要輸出日志的路徑。源碼// LoggerWithFormatter instance a Logger middleware with the specified log format function.funcLoggerWithFormatter(f LogFormatter)HandlerFunc{returnLoggerWithConfig(LoggerConfig{Formatter:f,})}// LoggerWithWriter instance a Logger middleware with the specified writer buffer.// Example: os.Stdout, a file opened in write mode, a socket...funcLoggerWithWriter(out io.Writer,notlogged...string)HandlerFunc{returnLoggerWithConfig(LoggerConfig{Output:out,SkipPaths:notlogged,})}可以看到另外兩個方法底層調(diào)用的依舊是gin.LoggerWithConfig(conf LoggerConfig)方法1.4.3. 自定義日志格式示例如果需要自定義日志格式可以使用gin.LoggerWithFormatter()r.Use(gin.LoggerWithFormatter(func(param gin.LogFormatterParams)string{returnfmt.Sprintf(%s - [%s] \%s %s %s %d %s \%s %s\n,param.ClientIP,param.TimeStamp.Format(time.RFC1123),param.Method,param.Path,param.Request.Proto,param.StatusCode,param.Latency,param.Request.UserAgent(),param.ErrorMessage,)}))1.4.4. 自定義日志輸出位置示例通過修改gin.DefaultWriter來設置輸出位置// 輸出到文件f,_:os.Create(gin.log)gin.DefaultWriterio.MultiWriter(f)r:gin.Default()// 同時輸出到控制臺和文件f,_:os.Create(gin.log)gin.DefaultWriterio.MultiWriter(f,os.Stdout)r:gin.Default()通過gin.LoggerWithWriter(out io.Writer, notlogged ...string)來設置輸出位置// 同時輸出到控制臺和文件logFile,_:os.OpenFile(./logs/gin.log,os.O_CREATE|os.O_RDWR|os.O_APPEND,0666)router:gin.New()router.Use(gin.LoggerWithWriter(io.MultiWriter(logFile,os.Stdout)))2. 集成第三方日志插件Gin框架內(nèi)置的日志中間件不直接支持日志級別控制等功能但可以通過集成第三方日志插件實現(xiàn)如logrus、zap等。2.1. 集成 logruspackagemainimport(github.com/gin-gonic/gingithub.com/sirupsen/logrusos)funcmain(){// 設置logrus格式log:logrus.New()log.SetFormatter(logrus.JSONFormatter{})log.SetOutput(os.Stdout)// 設置日志級別log.SetLevel(logrus.InfoLevel)r:gin.New()// 自定義日志中間件r.Use(func(c*gin.Context){start:time.Now()c.Next()latency:time.Since(start)clientIP:c.ClientIP()method:c.Request.Method statusCode:c.Writer.Status()path:c.Request.URL.Pathiflen(c.Errors)0{// 錯誤日志log.WithFields(logrus.Fields{latency:latency,client_ip:clientIP,method:method,status_code:statusCode,path:path,errors:c.Errors.ByType(gin.ErrorTypePrivate).Strings(),}).Error(Request Error)}else{// 普通請求日志log.WithFields(logrus.Fields{latency:latency,client_ip:clientIP,method:method,status_code:statusCode,path:path,}).Info(Request Info)}})r.GET(/hello,func(c*gin.Context){c.JSON(200,gin.H{message:Hello World})})r.GET(/error,func(c*gin.Context){c.AbortWithError(500,errors.New(internal error))})r.Run()}2.2 集成 zapZap是Uber開源的高性能日志庫適合對性能要求較高的場景packagemainimport(github.com/gin-gonic/gingo.uber.org/zap)funcmain(){logger,_:zap.NewProduction()deferlogger.Sync()// 確保緩沖區(qū)日志被刷新r:gin.New()// 自定義zap日志中間件r.Use(func(c*gin.Context){start:time.Now()path:c.Request.URL.Path raw:c.Request.URL.RawQuery c.Next()latency:time.Since(start)clientIP:c.ClientIP()method:c.Request.Method statusCode:c.Writer.Status()ifraw!{pathpath?raw}fields:[]zap.Field{zap.Int(status,statusCode),zap.String(method,method),zap.String(path,path),zap.String(ip,clientIP),zap.Duration(latency,latency),zap.String(user-agent,c.Request.UserAgent()),}iflen(c.Errors)0{fieldsappend(fields,zap.String(error,c.Errors.ByType(gin.ErrorTypePrivate).String()))logger.Error(Request Error,fields...)}else{logger.Info(Request Info,fields...)}})r.GET(/hello,func(c*gin.Context){c.JSON(200,gin.H{message:Hello World})})r.Run()}