golang日志包logger的用法詳解
1. logger包介紹
import "github.com/wonderivan/logger"
在我們開發go程序的過程中,發現記錄程序日志已經不是fmt.print這麼簡單,我們想到的是打印輸出能夠明確指定當時運行時間、運行代碼段,當然我們可以引入go官方自帶包 import “log”,然後通過log.Printf、log.Println等方式輸出,而且默認是日志輸出時隻帶時間的,想要同時輸出所運行代碼段位置,還需要通過執行一下指定進行相關簡單的設置
log.SetFlags(log.LstdFlags | log.Lshortfile) log.SetPrefix(xxx)
然而logger要做的並不僅僅是要這些:
logger支持自定義時間格式
logger支持不同的日志等級輸出,能夠有效提高日志輸出性能和檢索;
logger支持控制臺+文件+網絡的三種方式輸出,並且可以任意組合。
logger支持控制臺輸出顏色區分;
logger支持文本輸出的自定制;
logger支持網絡日志傳輸,例如直連logstash發送。
2. logger包使用
logger包使用起來非常方便,很多配置參數都有其默認值,符合通常使用習慣。如果僅需要在控制臺輸出,則隻需要引入該包,然後直接使用即可:
package main import "github.com/wonderivan/logger" func main() { logger.Trace("this is Trace") // 由於默認輸出,隻會在控制臺輸出Debug及其以上日志,所以該條不會輸出 logger.Debug("this is Debug") logger.Info("this is Info") logger.Warn("this is Warn") logger.Error("this is Error") logger.Crit("this is Critical") logger.Alert("this is Alert") logger.Emer("this is Emergency") }
此時在終端即可輸出(如果是非windows終端,支持日志等級顏色區分):
3. logger詳細介紹
在上邊介紹瞭logger的基本使用後,接下來詳細介紹一下該包的文本輸出和網絡輸出,及其相關配置項。
3.1 日志等級
當前日志輸出等級共8種,從0-7對應的等級由高到底,可以通過配置參數進行配置,默認為DEBG級別,當配置為某個輸出等級時,隻有大於等於該等級的日志才會輸出。不同的輸出適配器支持不同的日志等級配置。
等級 | 配置 | 釋義 | 控制臺顏色 |
0 | EMER | 系統級緊急,比如磁盤出錯,內存異常,網絡不可用等 | 紅色底 |
1 | ALRT | 系統級警告,比如數據庫訪問異常,配置文件出錯等 | 紫色 |
2 | CRIT | 系統級危險,比如權限出錯,訪問異常等 | 藍色 |
3 | EROR | 用戶級錯誤 | 紅色 |
4 | WARN | 用戶級警告 | 黃色 |
5 | INFO | 用戶級重要 | 天藍色 |
6 | DEBG | 用戶級調試 | 綠色 |
7 | TRAC | 用戶級基本輸出,比如成員信息,結構體值等 | 綠色 |
3.2 配置參數說明
logger當前支持控制臺、文件、網絡3種方式輸出,這3中輸出時通過各自的json格式參數進行設置,如果未配置某項適配器時,則不初始化也不會輸出到該適配器。
默認配置為隻控制臺輸出DEBG及其以上日志。
{ "TimeFormat":"2006-01-02 15:04:05", // 輸出日志開頭時間格式 "Console": { // 控制臺日志配置 "level": "TRAC", // 控制臺日志輸出等級 "color": true // 控制臺日志顏色開關 }, "File": { // 文件日志配置 "filename": "app.log", // 初始日志文件名 "level": "TRAC", // 日志文件日志輸出等級 "daily": true, // 跨天後是否創建新日志文件,當append=true時有效 "maxlines": 1000000, // 日志文件最大行數,當append=true時有效 "maxsize": 1, // 日志文件最大大小,當append=true時有效 "maxdays": -1, // 日志文件有效期 "append": true, // 是否支持日志追加 "permit": "0660" // 新創建的日志文件權限屬性 }, "Conn": { // 網絡日志配置 "net":"tcp", // 日志傳輸模式 "addr":"10.1.55.10:1024", // 日志接收服務器 "level": "Warn", // 網絡日志輸出等級 "reconnect":true, // 網絡斷開後是否重連 "reconnectOnMsg":false, // 發送完每條消息後是否斷開網絡 } }
輸出日志開頭時間格式隻要該符合go中Time.Format格式即可,例如:
時間類型 | 時間格式 |
---|---|
ANSIC | “Mon Jan _2 15:04:05 2006” |
UnixDate | “Mon Jan _2 15:04:05 MST 2006” |
RubyDate | “Mon Jan 02 15:04:05 -0700 2006” |
RFC822 | “02 Jan 06 15:04 MST” |
RFC822Z | “02 Jan 06 15:04 -0700” |
RFC850 | “Monday, 02-Jan-06 15:04:05 MST” |
RFC1123 | “Mon, 02 Jan 2006 15:04:05 MST” |
RFC1123Z | “Mon, 02 Jan 2006 15:04:05 -0700” |
RFC3339 | “2006-01-02T15:04:05Z07:00” |
RFC3339Nano | “2006-01-02T15:04:05.999999999Z07:00” |
Kitchen | “3:04PM” |
Stamp | “Jan _2 15:04:05” |
StampMilli | “Jan _2 15:04:05.000” |
StampMicro | “Jan _2 15:04:05.000000” |
StampNano | “Jan _2 15:04:05.000000000” |
RFC3339Nano1 | “2006-01-02 15:04:05.999999999 -0700 MST” |
DEFAULT | “2006-01-02 15:04:05” |
對應的輸出開頭時間格式為:
========RFC1123Z time format======== Thu, 02 Aug 2018 18:48:04 +0800 [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug R ========Stamp time format======== Aug 2 18:48:04 [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug Stamp ========StampMilli time format======== Aug 2 18:48:04.489 [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug StampMilli ========StampNano time format======== Aug 2 18:48:04.490002155 [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug StampNa ========RubyDate time format======== Thu Aug 02 18:48:04 +0800 2018 [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug Ru ========RFC822 time format======== 02 Aug 18 18:48 CST [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug RFC822 ========RFC822Z time format======== 02 Aug 18 18:48 +0800 [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug RFC822Z ========RFC1123 time format======== Thu, 02 Aug 2018 18:48:04 CST [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug RFC ========RFC3339 time format======== 2018-08-02T18:48:04+08:00 [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug RFC3339 ========RFC3339Nano time format======== 2018-08-02T18:48:04.490377325+08:00 [DEBG] [github.com/wonderivan/logger/log_test.go:115] Deb ========ANSIC time format======== Thu Aug 2 18:48:04 2018 [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug ANSIC ========UnixDate time format======== Thu Aug 2 18:48:04 CST 2018 [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug Unix ========RFC850 time format======== Thursday, 02-Aug-18 18:48:04 CST [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug ========Kitchen time format======== 6:48PM [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug Kitchen ========StampMicro time format======== Aug 2 18:48:04.490662 [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug StampMicro
3.3 設置配置參數:
通過調用logger.SetLogger(config string)方法設置參數,config支持json配置,也支持指定內容為json配置的文件路徑,例如:
// 通過配置參數直接配置 logger.SetLogger(`{"Console": {"level": "DEBG"}}`) // 通過配置文件配置 logger.SetLogger("/home/log.json")
3.4 配置其他相關說明
1、當日志文件配置項append為true時,如果當前寫入的日志發生跨天(daily為true)或超過最大限制時,會創建一個新文件,原有文件格式被重命名為: ****.xxxx-xx-xx.xxx.xxx 格式,例如:當向app.log寫入日志時,觸發瞭創建新文件操作,則將app.log重命名為 app.2018-01-01.001.log, 如果此時app.2018-01-01.001.log已經存在,則將剛才的app.log重命名為 app.2018-01-01.002.log,以此類推。
2、logger package默認初始化瞭全局的defaultLogger,所以直接調用logger.SetLogger的其實是給該對象設置輸出參數,如果想要使用自定義的logger對象,需要通過logger.NewLogger()進行初始化。
3、網絡配置中的reconnectOnMsg為true時,每條發送一條消息都會重連一次網絡日志中心,適用於寫日志頻率極低的情況下的調用,可以減少長時間網絡連接而占用資源。但強烈不建議平常使用時設置為true,這將會導致調用方反復的網絡重連,極大增加資源消耗和延遲。
4、conn網絡輸出適配器經過ELK集成環境的測試驗證,通過該方式發送的日志,能夠正常通過Elecsearch和Kibana檢索和分析
4 下載和使用
保證golang開發環境的正常配置,並且go相關工具安裝完成,GOPATH等設置正常(go開發所必須的)。
執行go get github.com/wonderivan/logger , 然後import 該包即可使用。
包源碼鏈接: golang日志包logger
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- Go中time.RFC3339 時間格式化的實現
- Python 中 logging 模塊使用詳情
- python 日志模塊logging的使用場景及示例
- Go語言Zap庫Logger的定制化和封裝使用詳解
- python自動化測試通過日志3分鐘定位bug