項目中有使用seelog包進行日誌處理,因此特地花點時間使用及通讀seelog的wiki全部文檔,先作筆記以下:git
一. seelog主要功能github
二. 項目對日誌的需求golang
三. 簡單實用seelog緩存
1 package main 2 3 import ( 4 log "github.com/cihub/seelog" 5 ) 6 7 func main() { 8 defer log.Flush() 9 log.Info("hello world") 10 }
1 package main 2 3 import ( 4 log "github.com/cihub/seelog" 5 ) 6 7 func SetupLogger() { 8 defer log.Flush() 9 10 // 加載日誌配置文件 11 logger, err := log.LoggerFromConfigAsFile("seelog.xml") 12 if err != nil { 13 return 14 } 15 16 // 替換日誌 17 log.ReplaceLogger(logger) 18 19 log.Info("hello world) 20 }
四. seelog配置文件網絡
1 <!-- 2 1. type: 日誌輸出類型,有4中類型,分別是:sync,asyncloop(default),asynctimer,adaptive 3 type=「sync」:在同一個go中處理日誌消息,僅當調用日誌函數時才被執行。 4 type=「asyncloop」:在單獨的go中獨自處理日誌消息,循環從日誌隊列中讀取日誌並消費(輸出到控制檯或者文件)。 5 type="asynctimer":在單獨的go中獨自處理日誌消息,在指定時間間隔去讀取日誌隊列消息,因此該類型還須要配置一個間隔時間(納秒)。 6 type="adaptive":在單獨的go中獨自處理日誌消息,可是不是固定的每隔指定時間去讀取日誌消息,間隔時間與隊列剩餘的日誌量有關,若是剩餘日誌量多,則間隔時間短,反之亦然 7 2. minlevel: 全局最低輸出日誌級別 8 3. maxlevel: 全局最高輸出日誌級別 9 4. exceptions: 日誌的特殊處理狀況,可根據指定文件或者函數進行日誌輸出 10 5. formatid: 輸出格式標籤,能夠在formats中找到對應的標籤 11 6. console: 將日誌輸出到控制檯 12 7. splitter: 用於細分outputs日誌格式,支持: file(文件), rollingfile(滾動文件), buffered(緩存到內存再輸出到文件), smtp(發送日誌郵件), con(網絡轉發) 13 8. rollingfile: 滾動文件,可基於日期(type="date")或者文件大小(type="size")進行日誌切割,maxsize: 單個日誌文件最大size,若是設置爲100M,則maxsize=100*1024*1024,maxrolls: 最大文件數量,超出的日誌文件數量會被滾動刪除 14 9. buffered: 將日誌先存在內存中,按期寫入文件,適合日誌併發量較大或 IO 比較緊張的場合,size:緩存大小, flushperiod:緩存時間 15 10. filter: 單獨處理某級別的日誌 16 11. formats: 日誌輸出格式 17 --> 18 <seelog type="asynctimer" asyncinterval="5000000" minlevel="debug" maxlevel="error"> 19 <exceptions> 20 <exception funcpattern="*main.test*Something*" minlevel="info"/> 21 <exception filepattern="*main.go" minlevel="error"/> 22 </exceptions> 23 <outputs formatid="main"> 24 <console/> 25 26 <splitter formatid="format1"> 27 <file path="log.log"/> 28 <file path="log2.log"/> 29 </splitter> 30 <splitter formatid="format2"> 31 <file path="log3.log"/> 32 <file path="log4.log"/> 33 </splitter> 34 35 <rollingfile formatid="someformat" type="size" filename="./log/roll.log" maxsize="100" maxrolls="5" /> 36 37 <buffered formatid="testlevels" size="10000" flushperiod="1000"> 38 <file path="./log/bufFileFlush.log"/> 39 </buffered> 40 41 <filter levels="error"> 42 <file path="./log/error.log"/> 43 <smtp senderaddress="noreply-notification-service@none.org" 44 sendername="Automatic notification service" 45 hostname="mail.none.org" 46 hostport="587" 47 username="nns" 48 password="123"> 49 <recipient address="john-smith@none.com"/> 50 <recipient address="hans-meier@none.com"/> 51 </smtp> 52 <conn net="tcp4" addr="server.address:5514" tls="true" insecureskipverify="true" /> 53 </filter> 54 55 </outputs> 56 <formats> 57 <format id="main" format="%Date(2006 Jan 02/3:04:05.000000000 PM MST) [%Level] %Msg%n"/> 58 <format id="someformat" format="%Ns [%Level] %Msg%n"/> 59 <format id="testlevels" format="%Level %Lev %LEVEL %LEV %l %Msg%n"/> 60 <format id="usetags" format="<msg>%Msg</time>"/> 61 <format id="format1" format="%Date/%Time [%LEV] %Msg%n"/> 62 <format id="format2" format="%File %FullPath %RelFile %Msg%n"/> 63 </formats> 64 </seelog>
1 <seelog levels="trace,debug,info,warn,error,critical"> 2 <outputs formatid="main"> 3 <!-- 對控制檯輸出的Log按級別分別用顏色顯示。6種日誌級別我僅分了三組顏色,若是想每一個級別都用不一樣顏色則須要簡單修改便可 --> 4 <filter levels="trace,debug,info"> 5 <console formatid="colored-default"/> 6 </filter> 7 <filter levels="warn"> 8 <console formatid="colored-warn"/> 9 </filter> 10 <filter levels="error,critical"> 11 <console formatid="colored-error"/> 12 </filter> 13 14 <!-- 將日誌輸出到磁盤文件,按文件大小進行切割日誌,單個文件最大100M,最多5個日誌文件 --> 15 <rollingfile formatid="main" type="size" filename="./log/default.log" maxsize="104857600" maxrolls="5" /> 16 </outputs> 17 <formats> 18 <format id="colored-default" format="%EscM(38)%Date %Time [%LEV] %File:%Line | %Msg%n%EscM(0)"/> 19 <format id="colored-warn" format="%EscM(33)%Date %Time [%LEV] %File:%Line | %Msg%n%EscM(0)"/> 20 <format id="colored-error" format="%EscM(31)%Date %Time [%LEV] %File:%Line | %Msg%n%EscM(0)"/> 21 <format id="main" format="%Date %Time [%LEV] %File:%Line | %Msg%n"/> 22 </formats> 23 </seelog>
五. seelog測試併發
1 package main 2 3 import ( 4 log "github.com/cihub/seelog" 5 ) 6 7 func main() { 8 defer log.Flush() 9 10 logger, err := log.LoggerFromConfigAsFile("config.xml") 11 if err != nil { 12 log.Errorf("parse config.xml error: %v", err) 13 return 14 } 15 16 log.ReplaceLogger(logger) 17 18 log.Info("seelog test begin") 19 20 for i := 0; i < 1; i++ { 21 log.Tracef("hello seelog trace, i = %d", i) 22 log.Debugf("hello seelog debug, i = %d", i) 23 log.Infof("hello seelog info, i = %d", i) 24 log.Warnf("hello seelog warn, i = %d", i) 25 log.Errorf("hello seelog error, i = %d", i) 26 log.Criticalf("hello seelog critical, i = %d", i) 27 } 28 29 log.Debug("seelog test end") 30 }
六. 參考文件async
1. seelog 源碼:https://github.com/cihub/seelogtcp
2. seelog wiki 文檔:https://github.com/cihub/seelog/wikiide
3. seelog 日誌控制檯帶顏色輸出中的顏色配置:https://en.wikipedia.org/wiki/ANSI_escape_code函數