實作 - 從零開始用 Golang 寫網頁 - 07 加入 LOG 系統

[實作] 從零開始用 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"
)
  • 先 import 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

  • 首先把 hostport 抽出,並針對CLI參數做判斷,在終端機啟動網頁服務時,可以設定 hostport,例如 :
1
go run -h 127.0.0.2
  • 接著使用 negroni

    • 使用 negroni.Classic() 建立一個 negroni 物件

    • 然後將 mux 傳入 UseHandler(),就可以將 mux 物件與 negroni(n) 結合

  • 最後在建立 Server 物件時,將路徑指向 negroni(n)

    • 就等於是在原本的路徑處理器上疊加一層程式碼,這樣才有了輸出系統紀錄的功能

結果

  • 終端機會隨時記錄下網頁操作的 LOG

接著將 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

  • 先新增一個變數來接收想放 LOG 的檔案位置

    • 跟前面一樣,只要輸入 -l--log 就可以輸入想放 LOG 的檔案位置
  • 接著新增 log 物件、檔案變數、錯誤變數,並把 log 的輸出位置指向該檔案

    • defer 為延遲執行,在該函式 return 前才會執行
  • 最後使用 negronilogrus 套件將 logrus 整合到 negroni 中

1
n.Use(negronilogrus.NewMiddlewareFromLogger(l, "web"))

結果

  • 終端機輸入
1
go run main.go -l D:\Desktop\GO\log\log.txt
  • 檔案內容

tags: 實作 Golang 網站
Author: Kenny Li
Link: https://kennyliblog.nctu.me/2020/09/11/Golang-Web7/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.