beego框架的logs包是一個用來處理日志的庫,目前支持的引擎有 file(輸出日志到文件)、console(終端輸出)、net(輸出到網絡地址)、smtp(發送郵件)。
一、beego自帶的日志功能(了解即可)
beego有自帶的日志功能(了解即可,即將被棄用了,主要使用beego的logs包),看下面示例:
func (c *InternelLogController) Get() { // 指定日志文件,指定日志文件后默認控制台和日志里都有日志輸出 beego.SetLogger("file", `{"filename":"logs/test-internel.log"}`) // 刪除日志輸出的引擎,在括號里指定要刪除的日志輸出的引擎,如果指定file就是不往日志里輸出,如果指定console就是不往控制台輸出 beego.BeeLogger.DelLogger("console") // 設置日志輸出的級別,日志里只記錄設置的日志級別及以上。 beego.SetLevel(beego.LevelError) // 日志級別與打印日志,beego自帶的日志共有八個級別(數值級別是0-8) beego.Emergency("emergency log") // 緊急的(數值級別:0) beego.Alert("alert log") // 警告的(數值級別:1) beego.Critical("critical log") // 關鍵的(數值級別:2) beego.Error("error log") // 錯誤日志(數值級別:3) beego.Warn("warn log") // 警告(數值級別:4) beego.Notice("notice log") // 通知(數值級別:5) beego.Informational("informational log") // 信息(數值級別:6) beego.Debug("debug log") // debug日志(數值級別:7) c.TplName = "test_internel_log.html" }
設置日志級別:
-
beego.SetLevel(beego.LevelError)
-
其他的日志級別:級別依次降低,數值的日志級別是從0開始的
-
0:LevelEmergency
-
1:LevelAlert
-
2:LevelCritical
-
3:LevelError
-
4:LevelWarning
-
5:LevelNotice
-
6:LevelInformational
-
7:LevelDebug
-
注意:
-
設置了日志級別,輸出的日志是當前的級別+比自身高的級別
-
比如設置了LevelAlert級別,則會輸出Alert和Emergency兩個級別的日志
輸出文件名和行號:
-
日志默認輸出調用的文件名和文件行號,如果不輸出文件和文件行號,則:
- beego.SetLogFuncCall(false)
二、logs包使用(后面主要使用這個包)
2.1、安裝日志包
> set GOPROXY=https://goproxy.cn > go get github.com/astaxie/beego/logs
2.2、日志級別
級別依次降低,數值的日志級別是從0開始的
- 0:LevelEmergency
- 1:LevelAlert
- 2:LevelCritical
- 3:LevelError
- 4:LevelWarn = LevelWarning
- 5:LevelNotice
- 6:LevelInfo = LevelInformational
- 7:LevelTrace = LevelDebug
2.3、日志引擎
日志引擎可以理解為日志輸出的位置,logs包支持如下日志引擎:
-
console
-
輸出到命令行
-
logs.SetLogger(logs.AdapterConsole, `{"level":1,"color":true}`)
-
level 輸出的日志級別
-
color 是否開啟打印日志彩色打印(需環境支持彩色輸出)

-
file
-
輸出到文件
-
logs.SetLogger(logs.AdapterFile, `{"filename":"test.log"}`)
-
filename 保存的文件名
maxlines 每個文件保存的最大行數,默認值 1000000
maxsize 每個文件保存的最大尺寸,默認值是 1 << 28, //256 MB 2^28 1<< 3 2^3
daily 是否按照每天 logrotate,默認是 true
maxdays 文件最多保存多少天,默認保存 7 天
rotate 是否開啟 logrotate,默認是 true
level 日志保存的時候的級別,默認是 Trace 級別
perm 日志文件權限 4(讀權限)2(寫權限)1(執行權限)
-
-
-
multifile
-
多文件日志寫入,對號入座寫入,比如test.error.log,err.debug.log
-
logs.SetLogger(logs.AdapterMultiFile, `{"filename":"test.log","separate":["emergency", "alert", "critical", "error", "warning", "notice", "info", "debug"]}`)
-
和file相比多了separate[`seprət`] 需要單獨寫入文件的日志級別,設置后命名類似 test.error.log
-
注意:不要設置太多的級別,不然文件分類就太多了,不利於排查
-
-
-
smtp:日志告警
-
-
郵件發送
-
logs.SetLogger(logs.AdapterMail,`{"username":"xxx@qq.com","password":"認證密碼","host":"smtp.qq.com:587","fromAddress":"xxx@qq.com","sendTos":["xxx@qq.com"]}`)
-
username smtp 驗證的用戶地址
-
password smtp 驗證密碼
-
host SMTP服務器地址
-
QQ郵箱:SMTP服務器地址:smtp.qq.com(端口:587)
-
雅虎郵箱: SMTP服務器地址:smtp.yahoo.com(端口:587)
-
163郵箱:SMTP服務器地址:smtp.163.com(端口:25)
-
126郵箱: SMTP服務器地址:smtp.126.com(端口:25)
-
新浪郵箱: SMTP服務器地址:smtp.sina.com(端口:25)
-
-
fromAddress 發件人
- 必須和前面認證的地址相同
-
sendTos 郵件需要發送的人,支持多個
-
subject 發送郵件的標題
-
level 日志發送的級別,默認是 Trace 級別
-
-
-
-
conn
-
網絡輸出
-
logs.SetLogger(logs.AdapterConn, `{"net":"tcp","addr":":7020"}`)
-
reconnectOnMsg 是否每次鏈接都重新打開鏈接,默認是 false
reconnect 是否自動重新鏈接地址,默認是 false
net 發開網絡鏈接的方式,可以使用 tcp、unix、udp 等
addr 網絡鏈接的地址
level 日志保存的時候的級別,默認是 Trace 級別
-
-
-
-
ElasticSearch
-
輸出到 ElasticSearch
-
logs.SetLogger(logs.AdapterEs,
{"dsn":"http://localhost:9200/","level":1})
-
-
簡聊
-
輸出到簡聊
-
logs.SetLogger(logs.AdapterJianLiao,
{"authorname":"xxx","title":"beego", "webhookurl":"https://jianliao.com/xxx", "redirecturl":"https://jianliao.com/xxx","imageurl":"https://jianliao.com/xxx","level":1})
-
-
slack
-
輸出到slack
-
logs.SetLogger(logs.AdapterSlack,
{"webhookurl":"https://slack.com/xxx","level":1})
2.4、輸出文件名和行號:默認為true
- logs.EnableFuncCallDepth(true)
2.5、異步輸出日志
-
為了提升性能, 可以設置異步輸出
- logs.Async()
-
異步輸出允許設置緩沖 chan 的大小
- logs.Async(1e3)
2.6、解決日志里記錄文件名及行號不正確問題
- logs.SetLogFuncCallDepth(3) // 默認值是4,顯示的文件和行號不對,改成3就好了
- 如果你的應用自己封裝了調用 log 包,那么需要設置 SetLogFuncCallDepth,默認是 2,也就是直接調用的層級,如果你封裝了多層,那么需要根據自己的需求進行調整.
三、logs包實戰
func main() { // 修改配置,解決日志輸出的信息里文件和行號不正確問題,在這里配置只在當前的controller生效,所以要在main函數里配置 logs.SetLogFuncCallDepth(3) // Console引擎設置日志級別的兩種方式,全局生效需要在main函數里配置 //logs.SetLogger(logs.AdapterConsole, `{"level":"LevelCritical","color":true}`) // 這個配置不好用,需要驗證 //logs.SetLevel(logs.LevelCritical) // file日志引擎設置 // logs.SetLogger(logs.AdapterFile, `{"filename":"logs/test-log.log"}`) // 多文件日志寫入,區分打印(error級別以上的輸出到error.log的日志里,error級別以下的輸出到info日志里) logs.SetLogger(logs.AdapterMultiFile, `{"filename":"logs/beego-project-multilog.log","separate":["error", "info"]}`) logs.Error("emergency log") // 緊急的 logs.Error("alert log") // 警告的 logs.Error("critical log") // 關鍵的 logs.Error("error log") // 錯誤日志 logs.Info("warn log") // 警告 logs.Info("notice log") // 通知 logs.Info("info log") // 信息 logs.Info("debug log") // debug日志 beego.Run() }
四、封裝日志模板
這里封裝一個過程進度的日志模板,日志里需要記錄如下幾條信息:
- 開始時間
- 當前第幾個
- 總數
- 已耗時
- 結束時間
4.1、封裝日志模板函數
package log_template import "fmt" func LogProcess(start_time string, cur int, count int, use_time string, end_time string) string { return fmt.Sprintf("starttime: %s, current/count:%d/%d, usetime: %s, endtime: %s", start_time, cur, count, use_time, end_time) }
4.2、程序使用日志模板
func (c *LogTemplateController) Get() { count := 7 for i:=1;i<count;i++ { // 獲取程序開始執行時間 start_time := time.Now() start_time_str := start_time.Format("2006-01-02 15:04:05") // 模擬程序執行耗時 time.Sleep(time.Second * 3) // 獲取程序執行結束時間 end_time := time.Now() end_time_str := end_time.Format("2006-01-02 15:04:05") cur := i // 當前執行的程序 count := count-1 // 總數 // 獲取程序執行耗時 use_time := end_time.Sub(start_time).String() // 使用日志模板將以上參數加工成規定得字符串 ret := log_template.LogProcess(start_time_str,cur,count,use_time,end_time_str) fmt.Println(ret) // 打印info級別的日志 logs.Info(ret) } c.TplName = "success.html" }
4.3、查看日志輸出
2020/10/09 17:02:45.699 [I] [log_template_controller.go:32] starttime: 2020-10-09 17:02:42, current/count:1/6, usetime: 3.0001097s, endtime: 2020-10-09 17:02:45 2020/10/09 17:02:48.699 [I] [log_template_controller.go:32] starttime: 2020-10-09 17:02:45, current/count:2/6, usetime: 3.0002995s, endtime: 2020-10-09 17:02:48 2020/10/09 17:02:51.700 [I] [log_template_controller.go:32] starttime: 2020-10-09 17:02:48, current/count:3/6, usetime: 3.0003854s, endtime: 2020-10-09 17:02:51 2020/10/09 17:03:30.652 [I] [log_template_controller.go:32] starttime: 2020-10-09 17:02:51, current/count:4/6, usetime: 3.0007772s, endtime: 2020-10-09 17:02:54 2020/10/09 17:03:33.656 [I] [log_template_controller.go:32] starttime: 2020-10-09 17:03:30, current/count:5/6, usetime: 3.000565s, endtime: 2020-10-09 17:03:33 2020/10/09 17:03:36.658 [I] [log_template_controller.go:32] starttime: 2020-10-09 17:03:33, current/count:6/6, usetime: 3.000843s, endtime: 2020-10-09 17:03:36
