Golang seelog 使用入門簡介

1 首先安裝Seelog庫

go get github.com/cihub/seelog

2 簡單的日誌輸出

參考官方文檔,些一個快速開始的 hello world 程序:

package main  

import log "github.com/cihub/seelog"  

func main() {  
    defer log.Flush()  
    log.Info("Hello world from Seelog!")  
}  

3 輸出到文件

3.1 使用 xml 配置文件

接下來我們些一個配置文件,使得 log 信息寫入到本地文件。

<seelog type="asynctimer" asyncinterval="5000000" minlevel="trace" maxlevel="error">  
   <outputs formatid="common">  

   <buffered formatid="common" size="10000" flushperiod="1000">  

   <rollingfile type="date" filename="./log/test.log" datepattern="02.01.2006" fullname="true" maxrolls="30"/>  

   </buffered>  

   </outputs>  

    <formats>  
        <!--  

        <format id="common" format="%Date %Time %EscM(46)[%LEV]%EscM(49)%EscM(0) [%File:%Line] [%Func] %Msg%n" />  
        -->  
        <format id="common" format="%Date %Time [%LEV] [%File:%Line] [%Func] %Msg%n" />  
    </formats>  
</seelog>  

按天拆分

<seelog type="asynctimer" asyncinterval="5000000" minlevel="trace" maxlevel="critical">
    <outputs formatid="main">
        <filter levels="trace,debug,info,warn,error,critical">
        <buffered size="10000" flushperiod="1000">
            <rollingfile type="date" filename="run.log" datepattern="20060102" maxrolls="30"/>
        </buffered>
        </filter>
    </outputs>
    <formats>
        <format id="main" format="%Time|%LEV|%File|%Line|%Msg%n"/>
    </formats>
</seelog>

其中:
outputs——裏面是日誌的配置,其中formatid中的id指定的是標籤中的id,也就是按照format標籤中格式來輸出日誌
buffered——指的是緩衝設置,size表示緩衝區大小,單位爲byte。flushperiod表示刷新時間間隔,單位爲ms

rollingfile——指定日誌設置,type指定回滾方式,data表示按時期回滾,maxrolls表示最大重命名文件數。

按上述文件進行配置,則可以保存30天內的日誌數據。個人還是比較喜歡這種配置方式的。當然對於更高級的配置,請參考官方文檔。鏈接如下:
https://github.com/cihub/seelog/wiki/Receiver-reference

接下來我們修改下剛纔的go代碼。

package main  

import (  
    log "github.com/cihub/seelog"  
    "fmt"  
)  

func main() {  
    defer log.Flush()  

    //加載配置文件  
    logger, err := log.LoggerFromConfigAsFile("config.xml")  

    if err!=nil{  

        fmt.Println("parse config.xml error")  
    }  

    //替換記錄器  
    log.ReplaceLogger(logger)  

    for i:=0;i<1024;i++{  

        log.Info("Hello from Seelog!")  
    }  
}

3.2 使用字節配置

import (
    "fmt"
    log "github.com/cihub/seelog"
)

type LogCfg struct {
    Levels              string `json:"levels"` 
    Fmt_id              string `json:"fmt_id"`
    Roll_type           string `json:"roll_type"`
    File_name           string `json:"file_name"`
    Roll_type_param     string `json:"roll_type_param"`
    Roll_type_max_rolls string `json:"roll_type_max_rolls"`
}

type LocalLogInterface log.LoggerInterface

func RollingFile( cfg LogCfg ) ( LocalLogInterface, error ) {

    logConfig_Temp := `
<seelog type="sync" levels="%s" >
    <outputs formatid="%s">
        <rollingfile type="%s" filename="%s" %s="%s" maxrolls="%s" />
    </outputs>
    <formats>
        <format id="main" format="[%%Date %%Time] [%%LEV] %%Func(): %%Msg%%n"/>
        <format id="sub1" format="[%%Date %%Time] [%%LEV]: %%Msg%%n"/>
        <format id="sub2" format="[%%Date - %%Time] [%%LEV] %%Func(): %%Msg%%n"/>
    </formats>
</seelog>`  

    cfg_roll_type_map := map[string] string { "date":"datepattern", "size":"maxsize" }

    roll_type_param_key, _ := cfg_roll_type_map[cfg.Roll_type]

    logConfig := fmt.Sprintf(  logConfig_Temp, 
                                cfg.Levels,
                                cfg.Fmt_id,
                                cfg.Roll_type, 
                                cfg.File_name, 
                                roll_type_param_key,
                                cfg.Roll_type_param,
                                cfg.Roll_type_max_rolls  )

    logger, err := log.LoggerFromConfigAsBytes( []byte( logConfig ) )

    if err != nil {
        fmt.Println( err )
    }

    loggerErr := log.ReplaceLogger( logger )

    if loggerErr != nil {
        fmt.Println( loggerErr )
    }

    return logger, err
}

本地日誌通過對第三方包 “github.com/cihub/seelog” 做的二次封裝,主要目的是爲了清晰地定義一部分日誌格式和統一配置文件爲 json 格式,方便使用。

配置說明

"levels":               "info, trace, error, critical",
"fmt_id":               "main",
"roll_type":            "date",
"file_name":            "./log/manyrolls_date.log",     
"roll_type_param":      "20180101",
"roll_type_max_rolls":  "4"
  1. levels 定義日誌都輸出哪些等級的日誌,可在以下內容中選擇任意數量的等級以逗號區分:trace,debug,info,warn,error,critical。

  2. fmt_id 日誌格式 ID,目前代碼中預定義的有 main,sub1,sub2.

    main: [2018-02-05 14:14:43] [INF] InitSqlPtr(): initSql init complete.

    sub1: [2018-02-05 14:14:43] [INF] InitSql init complete.

    sub2: [2018-02-05 - 14:14:43] [INF] InitSqlPtr(): initSql init complete.

  3. roll_type 回滾方式,選項 date 和 size,如果爲 date 將會按照時間拆分日誌,如果爲 size 將會按照 size 拆分日誌。

  4. file_name 日誌輸出文件路徑。

  5. roll_type_param 日誌輸出拆分參數,當 roll_type 爲 date 時,這個參數應該設置爲 20180101,爲時間限制; 當 roll_type 爲 date 時,這個參數應設爲 102400,爲日誌尺寸限制。

  6. roll_type_max_rolls 日誌最大拆分次數,如果設置爲 4 , 當第五次回滾拆分的時候,將會刪除歷史日誌最早的那隻文件。

使用舉例

logger, err := log.RollingFile( LocalLogCfg )
if nil != err {
    panic( err )
}

// 格式化輸出
logger.Infof( "cfg -->> %#v", LocalLogCfg )

// 輸出內容
logger.Trace("Test messagedddd!")
logger.Debug("Debug Printed")
logger.Info("Info Printed")
logger.Warn("Warn Printed")
logger.Error("Error Printed")
logger.Critical("Critical Printed")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章