beego web框架(二)之日誌處理
1. 使用入門
beego 的日誌處理是基於 logs 模組搭建的,內建了一個變數 BeeLogger
,預設已經是 logs.BeeLogger
型別,初始化了 console,也就是預設輸出到 console。
beego.Emergency("this is emergency")
beego.Alert("this is alert")
beego.Critical("this is critical")
beego.Error("this is error")
beego.Warning("this is warning")
beego.Notice("this is notice" )
beego.Informational("this is informational")
beego.Debug("this is debug")
2. 設定輸出
我們的程式往往期望把資訊輸出到 log 中,現在設定輸出到檔案很方便,如下所示:
beego.SetLogger("file", `{"filename":"logs/test.log"}`)
這個預設情況就會同時輸出到兩個地方,一個 console,一個 file,如果只想輸出到檔案,就需要呼叫刪除操作:
beego.BeeLogger.DelLogger("console")
3. 設定級別
LevelEmergency LevelAlert LevelCritical LevelError LevelWarning LevelNotice LevelInformational LevelDebug
級別依次降低,預設全部列印,但是一般我們在部署環境,可以通過設定級別設定日誌級別:
beego.SetLevel(beego.LevelInformational)
4. 輸出檔名和行號
日誌預設不輸出呼叫的檔名和檔案行號,如果你期望輸出呼叫的檔名和檔案行號,可以如下設定
beego.SetLogFuncCall(true)
開啟傳入引數 true, 關閉傳入引數 false, 預設是關閉的。
5. beego/logs模組的使用
是一個用來處理日誌的庫,目前支援的引擎有 file、console、net、smtp,可以通過如下方式進行安裝:
go get github.com/astaxie/beego/logs
5.1. 通用方式
首先引入包:
import ( "github.com/astaxie/beego/logs" )
然後新增輸出引擎(log 支援同時輸出到多個引擎),這裡我們以 console 為例,第一個引數是引擎名(包括:console、file、conn、smtp、es、multifile)
logs.SetLogger("console")
新增輸出引擎也支援第二個引數,用來表示配置資訊,詳細的配置請看下面介紹:
logs.SetLogger(logs.AdapterFile,`{"filename":"project.log","level":7,"maxlines":0,"maxsize":0,"daily":true,"maxdays":10}`)
示例:
package main
import (
"github.com/astaxie/beego/logs"
)
func main() {
//an official log.Logger
l := logs.GetLogger()
l.Println("this is a message of http")
//an official log.Logger with prefix ORM
logs.GetLogger("ORM").Println("this is a message of orm")
logs.Debug("my book is bought in the year of ", 2016)
logs.Info("this %s cat is %v years old", "yellow", 3)
logs.Warn("json is a type of kv like", map[string]int{"key": 2016})
logs.Error(1024, "is a very", "good game")
logs.Critical("oh,crash")
}
5.2. 輸出檔名和行號
日誌預設不輸出呼叫的檔名和檔案行號,如果你期望輸出呼叫的檔名和檔案行號,可以如下設定
logs.EnableFuncCallDepth(true)
開啟傳入引數 true,關閉傳入引數 false,預設是關閉的.
如果你的應用自己封裝了呼叫 log 包,那麼需要設定 SetLogFuncCallDepth,預設是 2,也就是直接呼叫的層級,如果你封裝了多層,那麼需要根據自己的需求進行調整.
logs.SetLogFuncCallDepth(3)
5.3. 非同步輸出日誌
為了提升效能, 可以設定非同步輸出:
logs.Async()
非同步輸出允許設定緩衝 chan 的大小
logs.Async(1e3)
5.4. 引擎配置
console
可以設定輸出的級別,或者不設定保持預設,預設輸出到
os.Stdout
:logs.SetLogger(logs.AdapterConsole, `{"level":1}`)
file
設定的例子如下所示:
logs.SetLogger(logs.AdapterFile, `{"filename":"test.log"}`)
主要的引數如下說明:
- filename 儲存的檔名
- maxlines 每個檔案儲存的最大行數,預設值 1000000
- maxsize 每個檔案儲存的最大尺寸,預設值是 1 << 28, //256 MB
- daily 是否按照每天 logrotate,預設是 true
- maxdays 檔案最多儲存多少天,預設儲存 7 天
- rotate 是否開啟 logrotate,預設是 true
- level 日誌儲存的時候的級別,預設是 Trace 級別
- perm 日誌檔案許可權
multifile
設定的例子如下所示:
logs.SetLogger(logs.AdapterMultiFile, ``{"filename":"test.log","separate":["emergency", "alert", "critical", "error", "warning", "notice", "info", "debug"]}``)
主要的引數如下說明(除 separate 外,均與file相同):
- filename 儲存的檔名
- maxlines 每個檔案儲存的最大行數,預設值 1000000
- maxsize 每個檔案儲存的最大尺寸,預設值是 1 << 28, //256 MB
- daily 是否按照每天 logrotate,預設是 true
- maxdays 檔案最多儲存多少天,預設儲存 7 天
- rotate 是否開啟 logrotate,預設是 true
- level 日誌儲存的時候的級別,預設是 Trace 級別
- perm 日誌檔案許可權
- separate 需要單獨寫入檔案的日誌級別,設定後命名類似 test.error.log
conn
網路輸出,設定的例子如下所示:
logs.SetLogger(logs.AdapterConn, `{"net":"tcp","addr":":7020"}`)
主要的引數說明如下:
- reconnectOnMsg 是否每次連結都重新開啟連結,預設是 false
- reconnect 是否自動重新連結地址,預設是 false
- net 發開網路連結的方式,可以使用 tcp、unix、udp 等
- addr 網路連結的地址
- level 日誌儲存的時候的級別,預設是 Trace 級別
smtp
郵件傳送,設定的例子如下所示:
logs.SetLogger(logs.AdapterMail, `{"username":"[email protected]","password":"xxxxxxxx","host":"smtp.gmail.com:587","sendTos":["[email protected]"]}`)
主要的引數說明如下:
- username smtp 驗證的使用者名稱
- password smtp 驗證密碼
- host 傳送的郵箱地址
- sendTos 郵件需要傳送的人,支援多個
- subject 傳送郵件的標題,預設是
Diagnostic message from server
- level 日誌傳送的級別,預設是 Trace 級別
ElasticSearch
輸出到 ElasticSearch:
logs.SetLogger(logs.AdapterEs, `{"dsn":"http://localhost:9200/","level":1}`