Golang 項目中集成日誌功能

Golang 項目中集成日誌功能

在一個 web 項目中,日誌打印功能是必須的,有了詳細的日誌能爲問題排查帶來很大的便利。Golang 有很多開源的日誌包可供使用,這裏我還是使用非常流行的 logrus 包,結合 file-rotatelogs 包實現日誌的自動切割輪轉。

集成方法:

  • 1.單獨定義一個 package 名爲 logger,裏面只有一個 init.go 文件,初始化日誌配置,這個配置是全局的:
    • 日誌輸出格式爲 json;
    • 日誌自動輪轉,保留最近 7 天日誌,一天產生一個日誌文件,防止服務長時間運行佔用系統過多的磁盤資源;
    • 日誌在輸出到文件的同時並打到 stdout;
package logger

import (
	"io"
	"os"
	"path"
	"time"

	log "github.com/sirupsen/logrus"
	rotatelogs "github.com/lestrrat-go/file-rotatelogs"

	"github.com/demo/pkg/common/config"
	"github.com/demo/pkg/utils/fs"
)

// 全局日誌配置初始化
// 1.日誌同時輸出到到文件和標準輸出;
// 2.保留最近 7 天日誌,一天一個日誌文件;
//
func init() {
	logDir := config.GetConfig().GetString("log_dir")
	if !fs.PathExists(logDir) {
		if err := os.MkdirAll(logDir, 0755); err != nil {
			panic(err)
		}
	}

	logfile := path.Join(logDir, "app")
	fsWriter, err := rotatelogs.New(
		logfile+"_%Y-%m-%d.log",
		rotatelogs.WithMaxAge(time.Duration(168)*time.Hour),
		rotatelogs.WithRotationTime(time.Duration(24)*time.Hour),
	)
	if err != nil {
		panic(err)
	}

	multiWriter := io.MultiWriter(fsWriter, os.Stdout)
	log.SetReportCaller(true)
	log.SetFormatter(&log.JSONFormatter{})
	log.SetOutput(multiWriter)
	log.SetLevel(log.InfoLevel)
}

  • 2.在項目入口 main 包引入該包,初始化全局日誌配置
package main
import (
    _ "github.com/demo/pkg/logger" // 引入包時自動執行了 logger 包的 init 函數完成了日誌初始化配置
)
  • 3.至此,在項目其他地方如果要打印日誌,直接引用 logrus 包即可,在 main 包中已經完成了日誌配置,無需在其他使用的地方再次初始化配置;
package hello

import (
    log "github.com/sirupsen/logrus"
)

func HelloLog() {
    log.Info("HelloLog func called")
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章