Go?Web實戰(zhàn)之創(chuàng)建項目及增加日志功能
從本文開始,我們來看一下如何從零搭建一個 Go 項目。
回顧一下基礎的 Go 項目運行過程
首先,新建一個 sports
的文件,然后鍵入此文件目錄下,選擇在終端中打開,使用如下命令初始化項目:
go mod init sports
然后,我們創(chuàng)建一個 main.go
的文件,寫入如下代碼:
package main import "fmt" func writeMessage() { fmt.Println("Let's Go") } func main() { writeMessage() }
回到終端,編譯并執(zhí)行我們的項目:
go run .
就像之前第一次寫一個 HelloWorld
項目一樣,run
命令會成功編譯并執(zhí)行我們的 Println()
內(nèi)的字符串 Let's Go,輸出結(jié)果如下:
$ go run . Let's Go
創(chuàng)建一些基本的項目功能
眾所周知,Web 應用有一些基礎的服務和功能如日志、文件配置等等。所以我們可以為 sports
項目提供一些基本的服務,這些服務將為運行網(wǎng)絡應用程序提供基礎。
創(chuàng)建日志接口 Logger
先來實現(xiàn)第一個服務器功能——日志。Go 標準庫中的 log
包為創(chuàng)建日志提供了一套非常用戶友好的基本功能,但在實際開發(fā)過程中,仍需要一些額外的功能來篩選一些信息詳情。
創(chuàng)建 sports/logging
文件夾,然后在這個文件夾下面創(chuàng)建一個 logging.go
文件,然后寫入如下代碼:
package logging type LogLevel int const ( Trace LogLevel = iota Debug Information Warning Fatal None ) type Logger interface { Trace(string) Tracef(string, ...interface{}) Debug(string) Debugf(string, ...interface{}) Info(string) Infof(string, ...interface{}) Warn(string) Warnf(string, ...interface{}) Panic(string) Panicf(string, ...interface{}) }
上面的代碼定義了 Logger
接口,并具體聲明了具體的日志消息的具體方法,分別有著不同的日志級別,LogLevel
從 Trace
到 Fatal
。值得注意的是也有一個無級別的 None
, 意味著沒有日志輸出。
對于每個級別的重要性,Logger
接口定義兩個方法:
- 一個用于接受簡單字符串的方法,如
Debug
- 一個用于接收模板字符串和占位符值的方法,如
Debugf
將日志功能定義為接口的好處是:在需要更改或替換功能時,只需要更改實現(xiàn),我們的調(diào)用接口并不需要改變;接口也使得功能作為服務提供給應用程序。
Logger 接口的具體實現(xiàn)
日志接口定義好了之后,我們來創(chuàng)建具體的 Logger
接口的實現(xiàn)。
創(chuàng)建一個 logger_default.go
的文件,然后寫入如下的代碼:
package logging import ( "fmt" "log" ) type DefaultLogger struct { minLevel LogLevel loggers map[LogLevel]*log.Logger triggerPanic bool } func (l *DefaultLogger) MinLogLevel() LogLevel { return l.minLevel } func (l *DefaultLogger) write(level LogLevel, message string) { if l.minLevel <= level { l.loggers[level].Output(2, message) } } func (l *DefaultLogger) Trace(msg string) { l.write(Trace, msg) } func (l *DefaultLogger) Tracef(template string, vals ...interface{}) { l.write(Trace, fmt.Sprintf(template, vals...)) } func (l *DefaultLogger) Debug(msg string) { l.write(Debug, msg) } func (l *DefaultLogger) Debugf(template string, vals ...interface{}) { l.write(Debug, fmt.Sprintf(template, vals...)) } func (l *DefaultLogger) Info(msg string) { l.write(Information, msg) } func (l *DefaultLogger) Infof(template string, vals ...interface{}) { l.write(Information, fmt.Sprintf(template, vals...)) } func (l *DefaultLogger) Warn(msg string) { l.write(Warning, msg) } func (l *DefaultLogger) Warnf(template string, vals ...interface{}) { l.write(Warning, fmt.Sprintf(template, vals...)) } func (l *DefaultLogger) Panic(msg string) { l.write(Fatal, msg) if l.triggerPanic { panic(msg) } } func (l *DefaultLogger) Panicf(template string, vals ...interface{}) { formattedMsg := fmt.Sprintf(template, vals...) l.write(Fatal, formattedMsg) if l.triggerPanic { panic(formattedMsg) } }
NewDefaultLogger()
函數(shù)創(chuàng)建一個具有最小嚴重程度日志 DefaultLogger
和 log.Loggers
將消息寫入標準輸出。
最終我們的目錄結(jié)構(gòu)如下:
測試日志功能
為了做一個簡單的測試,我們可以修改最開始的 main()
函數(shù),以便查看日志功能是否能成功打印出日志消息,回到 main.go
,寫入如下代碼:
package main import ( // "fmt" "sports/logging" ) func writeMessage(logger logging.Logger) { // fmt.Println("Let's Go") logger.Info("Let's Go, logger") } func main() { var logger logging.Logger = logging.NewDefaultLogger(logging.Information) writeMessage(logger) }
由 NewDefaultLogger
創(chuàng)建的最小日志級別被設置為 Information
,這意味著更低的日志級別(Trace
和 Debug
)將被忽略,再次編譯和執(zhí)行 sports
項目,就會看到本地的日志輸出,可能你按照我的操作只會時間戳不同,如下:
$ go run . 11:46:55 INFO Let's Go, logger
終端結(jié)果如圖所示:
總結(jié)
到了本文的總結(jié)時刻了,為了學習 Go Web 項目,本文先回顧了一下 Go 項目的初始化構(gòu)建和運行過程,然后往我們的 sports
項目中添加了一個日志功能,逐步完善日志接口和實現(xiàn),最后在主函數(shù)中進行了一個簡單的日志輸出測試。
到此這篇關(guān)于Go Web實戰(zhàn)之創(chuàng)建項目及增加日志功能的文章就介紹到這了,更多相關(guān)Go Web增加日志內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
加速開發(fā):使用Go語言和Gin框架構(gòu)建Web項目的利器
Go語言和Gin框架是構(gòu)建高性能Web項目的利器,Go語言的簡潔性和并發(fā)性,以及Gin框架的輕量級和快速路由能力,使開發(fā)者能夠快速構(gòu)建可靠的Web應用程序,需要的朋友可以參考下2023-09-09golang中l(wèi)og包自定義輸出日志格式與寫入到文件
這篇文章主要給大家介紹了關(guān)于golang中l(wèi)og包自定義輸出日志格式與寫入到文件的相關(guān)資料,日志輸出在任何項目中都極其重要,是有助于后續(xù)我們排查解決程序BUG,需要的朋友可以參考下2023-06-06Go語言內(nèi)建函數(shù)cap的實現(xiàn)示例
cap 是一個常用的內(nèi)建函數(shù),它用于獲取某些數(shù)據(jù)結(jié)構(gòu)的容量,本文主要介紹了Go語言內(nèi)建函數(shù)cap的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下2024-08-08