1. 程式人生 > >Golang基於beego框架開發Web APP的訪問日誌記錄模組

Golang基於beego框架開發Web APP的訪問日誌記錄模組

日誌系統或者說使用者操作記錄,在後端中的作用可謂是舉足輕重。那日誌記錄到底有什麼用?用處還真的挺多的,常見的比如debug、資料分析、安全防護等等等等。那今天我們用Golang基於beego框架寫一個伺服器端訪問日誌記錄模組,這裡面涉及到的知識點主要就是Golang的檔案讀寫。


Let's do it

因為我們的日誌記錄系統是基於beego的web應用,所以如果對beego不是很瞭解的朋友可以先去了解一下beego,不過其實也沒什麼大礙,因為可以順便當成是Golang處理文字檔案的參考教材大笑

為了讓所有的頁面都能執行這個日誌記錄程式碼,我們首先建立一個base.go的檔案,作為一個全部頁面所需要依賴的基礎控制器。

type Base struct {
	beego.Controller
}

然後沒建立一個控制器的時候,在申明的時候就可以直接呼叫這個基礎控制器。

type PageController struct {
	Base
}

這樣執行每個頁面控制器的同時會事先執行基礎控制器,也就是Base控制器。那我們把日誌記錄的程式碼寫在基礎控制器裡就好了。

我先把整體程式碼貼一下吧,反正就是相當easy,整體也沒什麼邏輯性,主要是字串拼接這樣子偷笑

func (s *Wxbase) Prepare() {
 url := s.Ctx.Request.RequestURI
 var cont string
 cont += "[T]" + Totime(time.Now().Unix(), "15:04:05") + " " + s.Ctx.Input.Method() + " " + s.Ctx.Input.Site() + s.Ctx.Input.URI() + " - [I]" + s.Ctx.Input.IP() + " | [U]" + s.Ctx.Input.UserAgent() + " [W]Wechat/Browser "
 if s.Ctx.Input.Referer() != "" {
  cont += "[F]" + s.Ctx.Input.Referer()
 }
 var filename = "./visit/logs/" + Totime(models.Gettimestemp(), "20060102") + ".log"
 var erro error
 f, erro := os.OpenFile(filename, os.O_CREATE|os.O_APPEND|os.O_RDWR, 0666)
 check(erro)
 _, erro = io.WriteString(f, cont+"\n")
 check(erro)
}
func check(e error) {
 if e != nil {
  beego.Debug(e)
 }
}

首先我們把使用者訪問的地址付給url變數(這個應該可以不用介紹吧 - -)

 url := s.Ctx.Request.RequestURI

然後把想要記錄的資料都按照格式拼接起來,為什麼按照格式拼接?你亂糟糟的看得懂?分析資料難道不需要程式來分析的嗎?

 cont += "[T]" + Totime(time.Now().Unix(), "15:04:05") + " " + s.Ctx.Input.Method() + " " + s.Ctx.Input.Site() + s.Ctx.Input.URI() + " - [I]" + s.Ctx.Input.IP() + " | [U]" + s.Ctx.Input.UserAgent() + " [W]Wechat/Browser "
 if s.Ctx.Input.Referer() != "" {
  cont += "[F]" + s.Ctx.Input.Referer()
 }

最後是以年月日為檔名,以讀寫追加的方式操作檔案。

 var filename = "./visit/logs/" + Totime(models.Gettimestemp(), "20060102") + ".log"
 var erro error
 f, erro := os.OpenFile(filename, os.O_CREATE|os.O_APPEND|os.O_RDWR, 0666)
 check(erro)
 _, erro = io.WriteString(f, cont+"\n")
 check(erro)

哦哦,這個Totime是我封裝的一個時間戳轉換,很簡單的,那也上一下程式碼吧:

func Totime(timestemp int64, format string) (times string) {
 tm := time.Unix(timestemp, 0)
 times = tm.Format(format)
 return
}

這樣,就可以記錄下使用者的訪問記錄了。當然,這裡的資料是我想要的,你可以吧自己想要的資料都加進去,然後得到自己想要的一個訪問日誌記錄。

但這個只是一個記錄日誌的方法,還有就是日誌分析程式,這個才是有意思的東西。分析資料真的相當有意思,不過這次就先寫這個日誌記錄,下次再寫一個日誌分析的程式吧,看這篇部落格是不是吸引人吧,要是有人支援,再給大家玩點有意思的大笑