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")
}