golang应用日志
seelog介紹
seelog是用Go語言實現(xiàn)的一個日志系統(tǒng),它提供了一些簡單的函數(shù)來實現(xiàn)復(fù)雜的日志分配、過濾和格式化。主要有如下特性:
-
XML的動態(tài)配置,可以不用重新編譯程序而動態(tài)的加載配置信息
-
支持熱更新,能夠動態(tài)改變配置而不需要重啟應(yīng)用
-
支持多輸出流,能夠同時把日志輸出到多種流中、例如文件流、網(wǎng)絡(luò)流等
-
支持不同的日志輸出
- 命令行輸出
- 文件輸出
- 緩存輸出
- 支持log rotate
- SMTP郵件
上面只列舉了部分特性,seelog是一個特別強大的日志處理系統(tǒng),詳細的內(nèi)容請參看官方wiki。接下來我將簡要介紹一下如何在項目中使用它:
首先安裝seelog
go get -u github.com/cihub/seelog然后我們來看一個簡單的例子:
package mainimport log "github.com/cihub/seelog"func main() {defer log.Flush()log.Info("Hello from Seelog!") }編譯后運行如果出現(xiàn)了Hello from seelog,說明seelog日志系統(tǒng)已經(jīng)成功安裝并且可以正常運行了。
基于seelog的自定義日志處理
seelog支持自定義日志處理,下面是我基于它自定義的日志處理包的部分內(nèi)容:
package logsimport ("errors""fmt"seelog "github.com/cihub/seelog""io" )var Logger seelog.LoggerInterfacefunc loadAppConfig() {appConfig := ` <seelog minlevel="warn"><outputs formatid="common"><rollingfile type="size" filename="/data/logs/roll.log" maxsize="100000" maxrolls="5"/><filter levels="critical"><file path="/data/logs/critical.log" formatid="critical"/><smtp formatid="criticalemail" senderaddress="astaxie@gmail.com" sendername="ShortUrl API" hostname="smtp.gmail.com" hostport="587" username="mailusername" password="mailpassword"><recipient address="xiemengjun@gmail.com"/></smtp></filter></outputs><formats><format id="common" format="%Date/%Time [%LEV] %Msg%n" /><format id="critical" format="%File %FullPath %Func %Msg%n" /><format id="criticalemail" format="Critical error on our server!\n %Time %Date %RelFile %Func %Msg \nSent by Seelog"/></formats> </seelog> `logger, err := seelog.LoggerFromConfigAsBytes([]byte(appConfig))if err != nil {fmt.Println(err)return}UseLogger(logger) }func init() {DisableLog()loadAppConfig() }// DisableLog disables all library log output func DisableLog() {Logger = seelog.Disabled }// UseLogger uses a specified seelog.LoggerInterface to output library log. // Use this func if you are using Seelog logging system in your app. func UseLogger(newLogger seelog.LoggerInterface) {Logger = newLogger }上面主要實現(xiàn)了三個函數(shù),
-
DisableLog
初始化全局變量Logger為seelog的禁用狀態(tài),主要為了防止Logger被多次初始化
-
loadAppConfig
根據(jù)配置文件初始化seelog的配置信息,這里我們把配置文件通過字符串讀取設(shè)置好了,當然也可以通過讀取XML文件。里面的配置說明如下:
-
seelog
minlevel參數(shù)可選,如果被配置,高于或等于此級別的日志會被記錄,同理maxlevel。
-
outputs
輸出信息的目的地,這里分成了兩份數(shù)據(jù),一份記錄到log rotate文件里面。另一份設(shè)置了filter,如果這個錯誤級別是critical,那么將發(fā)送報警郵件。
-
formats
定義了各種日志的格式
-
-
UseLogger
設(shè)置當前的日志器為相應(yīng)的日志處理
上面我們定義了一個自定義的日志處理包,下面就是使用示例:
package mainimport ("net/http""project/logs""project/configs""project/routes" )func main() {addr, _ := configs.MainConfig.String("server", "addr")logs.Logger.Info("Start server at:%v", addr)err := http.ListenAndServe(addr, routes.NewMux())logs.Logger.Critical("Server err:%v", err) }發(fā)生錯誤發(fā)送郵件
上面的例子解釋了如何設(shè)置發(fā)送郵件,我們通過如下的smtp配置用來發(fā)送郵件:
<smtp formatid="criticalemail" senderaddress="astaxie@gmail.com" sendername="ShortUrl API" hostname="smtp.gmail.com" hostport="587" username="mailusername" password="mailpassword"><recipient address="xiemengjun@gmail.com"/> </smtp>郵件的格式通過criticalemail配置,然后通過其他的配置發(fā)送郵件服務(wù)器的配置,通過recipient配置接收郵件的用戶,如果有多個用戶可以再添加一行。
要測試這個代碼是否正常工作,可以在代碼中增加類似下面的一個假消息。不過記住過后要把它刪除,否則上線之后就會收到很多垃圾郵件。
logs.Logger.Critical("test Critical message")現(xiàn)在,只要我們的應(yīng)用在線上記錄一個Critical的信息,你的郵箱就會收到一個Email,這樣一旦線上的系統(tǒng)出現(xiàn)問題,你就能立馬通過郵件獲知,就能及時的進行處理。
使用應(yīng)用日志
對于應(yīng)用日志,每個人的應(yīng)用場景可能會各不相同,有些人利用應(yīng)用日志來做數(shù)據(jù)分析,有些人利用應(yīng)用日志來做性能分析,有些人來做用戶行為分析,還有些就是純粹的記錄,以方便應(yīng)用出現(xiàn)問題的時候輔助查找問題。
舉一個例子,我們需要跟蹤用戶嘗試登陸系統(tǒng)的操作。這里會把成功與不成功的嘗試都記錄下來。記錄成功的使用"Info"日志級別,而不成功的使用"warn"級別。如果想查找所有不成功的登陸,我們可以利用linux的grep之類的命令工具,如下:
# cat /data/logs/roll.log | grep "failed login" 2012-12-11 11:12:00 WARN : failed login attempt from 11.22.33.44 username password通過這種方式我們就可以很方便的查找相應(yīng)的信息,這樣有利于我們針對應(yīng)用日志做一些統(tǒng)計和分析。另外我們還需要考慮日志的大小,對于一個高流量的Web應(yīng)用來說,日志的增長是相當可怕的,所以我們在seelog的配置文件里面設(shè)置了logrotate,這樣就能保證日志文件不會因為不斷變大而導(dǎo)致我們的磁盤空間不夠引起問題。
總結(jié)
以上是生活随笔為你收集整理的golang应用日志的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Go怎么写测试用例
- 下一篇: golang网站错误处理