go語言web開發22 - beego框架之logs包使用


beego框架的logs包是一個用來處理日志的庫,目前支持的引擎有 file(輸出日志到文件)、console(終端輸出)、net(輸出到網絡地址)、smtp(發送郵件)。

 

一、beego自帶的日志功能(了解即可)

beego有自帶的日志功能(了解即可,即將被棄用了,主要使用beego的logs包),看下面示例:

func (c *InternelLogController) Get() {
    // 指定日志文件,指定日志文件后默認控制台和日志里都有日志輸出
    beego.SetLogger("file", `{"filename":"logs/test-internel.log"}`)
    // 刪除日志輸出的引擎,在括號里指定要刪除的日志輸出的引擎,如果指定file就是不往日志里輸出,如果指定console就是不往控制台輸出
    beego.BeeLogger.DelLogger("console")
    // 設置日志輸出的級別,日志里只記錄設置的日志級別及以上。
    beego.SetLevel(beego.LevelError)


    // 日志級別與打印日志,beego自帶的日志共有八個級別(數值級別是0-8)
    beego.Emergency("emergency log")    // 緊急的(數值級別:0)
    beego.Alert("alert log")            // 警告的(數值級別:1)
    beego.Critical("critical log")      // 關鍵的(數值級別:2)
    beego.Error("error log")            // 錯誤日志(數值級別:3)
    beego.Warn("warn log")              // 警告(數值級別:4)
    beego.Notice("notice log")          // 通知(數值級別:5)
    beego.Informational("informational log")             // 信息(數值級別:6)
    beego.Debug("debug log")             // debug日志(數值級別:7)

    c.TplName = "test_internel_log.html"
}
設置日志級別:
  • beego.SetLevel(beego.LevelError)
  • 其他的日志級別:級別依次降低,數值的日志級別是從0開始的
    • 0:LevelEmergency

    • 1:LevelAlert

    • 2:LevelCritical

    • 3:LevelError

    • 4:LevelWarning

    • 5:LevelNotice

    • 6:LevelInformational

    • 7:LevelDebug

注意:

  • 設置了日志級別,輸出的日志是當前的級別+比自身高的級別

  • 比如設置了LevelAlert級別,則會輸出Alert和Emergency兩個級別的日志

輸出文件名和行號:

  • 日志默認輸出調用的文件名和文件行號,如果不輸出文件和文件行號,則:

    • beego.SetLogFuncCall(false)

 

二、logs包使用(后面主要使用這個包)

2.1、安裝日志包

> set GOPROXY=https://goproxy.cn
> go get github.com/astaxie/beego/logs

 

2.2、日志級別

級別依次降低,數值的日志級別是從0開始的

  • 0:LevelEmergency
  • 1:LevelAlert
  • 2:LevelCritical
  • 3:LevelError
  • 4:LevelWarn = LevelWarning
  • 5:LevelNotice
  • 6:LevelInfo = LevelInformational
  • 7:LevelTrace = LevelDebug

 

2.3、日志引擎

日志引擎可以理解為日志輸出的位置,logs包支持如下日志引擎:

  • console
    • 輸出到命令行

    • logs.SetLogger(logs.AdapterConsole, `{"level":1,"color":true}`)

      • level 輸出的日志級別

      • color 是否開啟打印日志彩色打印(需環境支持彩色輸出)

                          

  • file
    • 輸出到文件

    • logs.SetLogger(logs.AdapterFile, `{"filename":"test.log"}`)

      • filename 保存的文件名

        maxlines 每個文件保存的最大行數,默認值 1000000

        maxsize 每個文件保存的最大尺寸,默認值是 1 << 28, //256 MB 2^28 1<< 3 2^3

        daily 是否按照每天 logrotate,默認是 true

        maxdays 文件最多保存多少天,默認保存 7 天

        rotate 是否開啟 logrotate,默認是 true

        level 日志保存的時候的級別,默認是 Trace 級別

        perm 日志文件權限 4(讀權限)2(寫權限)1(執行權限)

  • multifile
    • 多文件日志寫入,對號入座寫入,比如test.error.log,err.debug.log

    • logs.SetLogger(logs.AdapterMultiFile, `{"filename":"test.log","separate":["emergency", "alert", "critical", "error", "warning", "notice", "info", "debug"]}`)

      • 和file相比多了separate[`seprət`] 需要單獨寫入文件的日志級別,設置后命名類似 test.error.log

      • 注意:不要設置太多的級別,不然文件分類就太多了,不利於排查

  • smtp:日志告警
      • 郵件發送

      • logs.SetLogger(logs.AdapterMail,`{"username":"xxx@qq.com","password":"認證密碼","host":"smtp.qq.com:587","fromAddress":"xxx@qq.com","sendTos":["xxx@qq.com"]}`)

        • username smtp 驗證的用戶地址

        • password smtp 驗證密碼

        • host SMTP服務器地址

          • QQ郵箱:SMTP服務器地址:smtp.qq.com(端口:587)

          • 雅虎郵箱: SMTP服務器地址:smtp.yahoo.com(端口:587)

          • 163郵箱:SMTP服務器地址:smtp.163.com(端口:25)

          • 126郵箱: SMTP服務器地址:smtp.126.com(端口:25)

          • 新浪郵箱: SMTP服務器地址:smtp.sina.com(端口:25)

        • fromAddress 發件人

          • 必須和前面認證的地址相同
        • sendTos 郵件需要發送的人,支持多個

        • subject 發送郵件的標題

        • level 日志發送的級別,默認是 Trace 級別

     

  • conn
    • 網絡輸出
      • logs.SetLogger(logs.AdapterConn, `{"net":"tcp","addr":":7020"}`)

        • reconnectOnMsg 是否每次鏈接都重新打開鏈接,默認是 false

          reconnect 是否自動重新鏈接地址,默認是 false

          net 發開網絡鏈接的方式,可以使用 tcp、unix、udp 等

          addr 網絡鏈接的地址

          level 日志保存的時候的級別,默認是 Trace 級別

 

  • ElasticSearch
    • 輸出到 ElasticSearch

    • logs.SetLogger(logs.AdapterEs, {"dsn":"http://localhost:9200/","level":1})

  • 簡聊
    • 輸出到簡聊

    • logs.SetLogger(logs.AdapterJianLiao, {"authorname":"xxx","title":"beego", "webhookurl":"https://jianliao.com/xxx", "redirecturl":"https://jianliao.com/xxx","imageurl":"https://jianliao.com/xxx","level":1})

  • slack
    • 輸出到slack

    • logs.SetLogger(logs.AdapterSlack, {"webhookurl":"https://slack.com/xxx","level":1})

 

2.4、輸出文件名和行號:默認為true

  • logs.EnableFuncCallDepth(true)

 

2.5、異步輸出日志

  • 為了提升性能, 可以設置異步輸出

    • logs.Async()
  • 異步輸出允許設置緩沖 chan 的大小

    • logs.Async(1e3)

 

2.6、解決日志里記錄文件名及行號不正確問題

  • logs.SetLogFuncCallDepth(3) // 默認值是4,顯示的文件和行號不對,改成3就好了
  • 如果你的應用自己封裝了調用 log 包,那么需要設置 SetLogFuncCallDepth,默認是 2,也就是直接調用的層級,如果你封裝了多層,那么需要根據自己的需求進行調整.

 

三、logs包實戰

func main() {
    // 修改配置,解決日志輸出的信息里文件和行號不正確問題,在這里配置只在當前的controller生效,所以要在main函數里配置
    logs.SetLogFuncCallDepth(3)

    // Console引擎設置日志級別的兩種方式,全局生效需要在main函數里配置
    //logs.SetLogger(logs.AdapterConsole, `{"level":"LevelCritical","color":true}`)      // 這個配置不好用,需要驗證
    //logs.SetLevel(logs.LevelCritical)

    // file日志引擎設置
    // logs.SetLogger(logs.AdapterFile, `{"filename":"logs/test-log.log"}`)

    // 多文件日志寫入,區分打印(error級別以上的輸出到error.log的日志里,error級別以下的輸出到info日志里)
    logs.SetLogger(logs.AdapterMultiFile, `{"filename":"logs/beego-project-multilog.log","separate":["error", "info"]}`)
    logs.Error("emergency log")    // 緊急的
    logs.Error("alert log")            // 警告的
    logs.Error("critical log")      // 關鍵的
    logs.Error("error log")            // 錯誤日志
    logs.Info("warn log")              // 警告
    logs.Info("notice log")          // 通知
    logs.Info("info log")            // 信息
    logs.Info("debug log")            // debug日志

    beego.Run()
}

 

四、封裝日志模板

這里封裝一個過程進度的日志模板,日志里需要記錄如下幾條信息:

  • 開始時間
  • 當前第幾個
  • 總數
  • 已耗時
  • 結束時間

 

4.1、封裝日志模板函數

package log_template

import "fmt"

func LogProcess(start_time string, cur int, count int, use_time string, end_time string) string {
    return fmt.Sprintf("starttime: %s, current/count:%d/%d, usetime: %s, endtime: %s", start_time, cur, count, use_time, end_time)
}

 

4.2、程序使用日志模板

func (c *LogTemplateController) Get() {

    count := 7
    for i:=1;i<count;i++  {
        // 獲取程序開始執行時間
        start_time := time.Now()
        start_time_str := start_time.Format("2006-01-02 15:04:05")

        // 模擬程序執行耗時
        time.Sleep(time.Second * 3)

        // 獲取程序執行結束時間
        end_time := time.Now()
        end_time_str := end_time.Format("2006-01-02 15:04:05")

        cur := i      // 當前執行的程序
        count := count-1       // 總數

        // 獲取程序執行耗時
        use_time := end_time.Sub(start_time).String()

        // 使用日志模板將以上參數加工成規定得字符串
        ret := log_template.LogProcess(start_time_str,cur,count,use_time,end_time_str)
        fmt.Println(ret)

        // 打印info級別的日志
        logs.Info(ret)

    }


    c.TplName = "success.html"
}

 

4.3、查看日志輸出

2020/10/09 17:02:45.699 [I] [log_template_controller.go:32]  starttime: 2020-10-09 17:02:42, current/count:1/6, usetime: 3.0001097s, endtime: 2020-10-09 17:02:45
2020/10/09 17:02:48.699 [I] [log_template_controller.go:32]  starttime: 2020-10-09 17:02:45, current/count:2/6, usetime: 3.0002995s, endtime: 2020-10-09 17:02:48
2020/10/09 17:02:51.700 [I] [log_template_controller.go:32]  starttime: 2020-10-09 17:02:48, current/count:3/6, usetime: 3.0003854s, endtime: 2020-10-09 17:02:51
2020/10/09 17:03:30.652 [I] [log_template_controller.go:32]  starttime: 2020-10-09 17:02:51, current/count:4/6, usetime: 3.0007772s, endtime: 2020-10-09 17:02:54
2020/10/09 17:03:33.656 [I] [log_template_controller.go:32]  starttime: 2020-10-09 17:03:30, current/count:5/6, usetime: 3.000565s, endtime: 2020-10-09 17:03:33
2020/10/09 17:03:36.658 [I] [log_template_controller.go:32]  starttime: 2020-10-09 17:03:33, current/count:6/6, usetime: 3.000843s, endtime: 2020-10-09 17:03:36

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM