golang-seelog

  項目中有使用seelog包進行日誌處理,因此特地花點時間使用及通讀seelog的wiki全部文檔,先作筆記以下:git

一. seelog主要功能github

  • 設置不一樣日誌級別(trace, debug, info, warn, error, critical, off)
  • 輸出到終端(可基於日誌級別設置不一樣顏色顯示)和磁盤文件
  • 過濾指定級別日誌
  • 定義多種日誌輸出格式
  • 根據文件或者函數進行日誌輸出
  • 經過 SMTP 或者 TCP 轉發日誌
  • 滾動日誌文件(基於日期或者指定文件大小進行切割日誌,並能自動刪除"過時"日誌文件)

二. 項目對日誌的需求golang

  • 能設置不一樣日誌級別(知足)
  • 能將日誌輸出到終端且同時輸出到磁盤文件(知足)
  • 能對日誌進行切割,能基於日期或者指定日誌文件大小進行日誌切割(知足)
  • (個人需求) 能在控制檯對不一樣級別的日誌以顏色加以區分(知足)

三. 簡單實用seelog緩存

  • 無日誌配置文件的Demo
 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 }
View Code
  • 有日誌配置文件的Demo
 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 }
View Code

四. seelog配置文件網絡

  • 解讀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="&lt;msg&gt;%Msg&lt;/time&gt;"/>
61         <format id="format1" format="%Date/%Time [%LEV] %Msg%n"/>
62         <format id="format2" format="%File %FullPath %RelFile %Msg%n"/>
63     </formats>
64 </seelog>
View Code
  • 我測試時的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>
View Code

五. seelog測試併發

  • golang main.go
 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 }
View Code
  • 輸出

 

六. 參考文件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函數

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息