[實作] 從零開始用 Golang 寫網頁 : 07 加入 LOG 系統
若是網頁要上線勢必要有一套系統紀錄的方案來做監控,這邊使用 negroni 與 logrus 來建立系統紀錄的功能
首先單用 negroni 試試
- negroni 本身是一個中介軟體,可以和 Golang 的網頁程式結合
1 2 3 4 5 6 7 8 9 10
| import ( "fmt" "log" "net/http" "os" "text/template"
"github.com/julienschmidt/httprouter" "github.com/urfave/negroni" )
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| func main() {
host := "127.0.0.1" port := "8080"
args := os.Args[1:]
for { if len(args) < 2 { break } else if args[0] == "-h" || args[0] == "--host" { host = args[1] args = args[2:] } else if args[0] == "-port" || args[0] == "--port" { port = args[1] args = args[2:] } else { log.Fatalln(fmt.Sprintf("Unknown parameter : %s", args[0])) } }
mux := httprouter.New()
mux.GET("/", index) mux.GET("/:name", hello)
mux.NotFound = http.HandlerFunc(notFound)
mux.PanicHandler = errHandler
n := negroni.Classic() n.UseHandler(mux)
server := http.Server{ Addr: fmt.Sprintf("%s:%s", host, port), Handler: n, }
log.Println(fmt.Sprintf("服務器即將開啟, 訪問地址 http://%s:%s", host, port)) log.Fatal(server.ListenAndServe()) }
|
main
- 首先把
host
、port
抽出,並針對CLI參數做判斷,在終端機啟動網頁服務時,可以設定 host
、port
,例如 :
結果
接著將 logrus 整合進來
- negroni 無法將將記錄檔從檔案或其他地方輸出,有人將 negroni 和 logrus 結合,解決了這個問題
1 2 3 4 5 6 7 8 9 10 11 12
| import ( "fmt" "net/http" "os" "text/template"
"github.com/julienschmidt/httprouter" log "github.com/sirupsen/logrus" "github.com/urfave/negroni"
negronilogrus "github.com/meatballhat/negroni-logrus" )
|
- import logrus 取代內建的 log 與用來結合 negroni 和 logrus 的套件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| func main() {
host := "127.0.0.1" port := "8080" output := ""
args := os.Args[1:]
for { if len(args) < 2 { break } else if args[0] == "-h" || args[0] == "--host" { host = args[1] args = args[2:] } else if args[0] == "-p" || args[0] == "--port" { port = args[1] args = args[2:] } else if args[0] == "-l" || args[0] == "--log" { output = args[1] args = args[2:] } else { log.Fatalln(fmt.Sprintf("Unknown parameter : %s", args[0])) } }
mux := httprouter.New()
mux.GET("/", index) mux.GET("/:name", hello)
mux.NotFound = http.HandlerFunc(notFound)
mux.PanicHandler = errHandler
l := log.New()
var f *os.File var err error
if output != "" { f, err = os.Create(output) if err != nil { log.Fatal(err) }
defer f.Close() l.SetOutput(f) }
n := negroni.Classic() n.Use(negronilogrus.NewMiddlewareFromLogger(l, "web")) n.UseHandler(mux)
server := http.Server{ Addr: fmt.Sprintf("%s:%s", host, port), Handler: n, }
l.Println(fmt.Sprintf("服務器即將開啟, 訪問地址 http://%s:%s", host, port)) l.Fatal(server.ListenAndServe()) }
|
main
1
| n.Use(negronilogrus.NewMiddlewareFromLogger(l, "web"))
|
結果
1
| go run main.go -l D:\Desktop\GO\log\log.txt
|