在上一節內容中, 咱們使用 viper 讀取了配置文件.git
本節將使用 logrus 記錄日誌.github
logrus 是一個結構化的日誌記錄器, 和標準庫中的 logger 具備徹底兼容的 API.web
首先, 更新一下配置文件, 加入如下參數:json
log:
use_json: true
logger_level: debug
logger_file: log/server.log
gin_file: log/gin.log
gin_console: true
複製代碼
logrus 支持使用 JSON 格式記錄日誌:spa
logrus.SetFormatter(&log.JSONFormatter{})
複製代碼
第二三參數設置了日誌的記錄級別和日誌保存路徑, 最後兩個參數是 gin 的日誌設置參數.debug
// 初始化日誌
func (c *Config) InitLog() {
// log.use_json
if viper.GetBool("log.use_json") {
logrus.SetFormatter(&logrus.JSONFormatter{})
}
// log.logger_level
switch viper.GetString("log.logger_level") {
case "trace":
logrus.SetLevel(logrus.TraceLevel)
case "debug":
logrus.SetLevel(logrus.DebugLevel)
case "info":
logrus.SetLevel(logrus.InfoLevel)
case "warn":
logrus.SetLevel(logrus.WarnLevel)
case "error":
logrus.SetLevel(logrus.ErrorLevel)
}
// log.logger_file
logger_file := viper.GetString("log.logger_file")
os.MkdirAll(filepath.Dir(logger_file), os.ModePerm)
file, err := os.OpenFile(logger_file, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666)
if err == nil {
logrus.SetOutput(file)
}
// log.gin_file & log.gin_console
gin_file := viper.GetString("log.gin_file")
os.MkdirAll(filepath.Dir(gin_file), os.ModePerm)
file, err = os.OpenFile(gin_file, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666)
if err == nil {
if viper.GetBool("log.gin_console") {
gin.DefaultWriter = io.MultiWriter(file, os.Stdout)
} else {
gin.DefaultWriter = io.MultiWriter(file)
}
}
// default
logrus.SetReportCaller(true)
}
複製代碼
這方法就是讀取了日誌相關的配置參數, 而後調用對應的方法.日誌
那麼在哪裏調用這個方法呢?code
目前我是在 initConfig
中調用的, 這使得日誌配置在初始化時就固定了, 所以當調整配置文件時不會影響日誌相關的配置.orm
若是須要實時更新日誌配置, 能夠考慮放在 runServer
中.server
和原做者不一樣的地方在於, 我沒有考慮日誌的壓縮與轉儲.
另一點是沒有統一處理 gin 的日誌, 選擇了分散處理.
做爲版本 v0.3.0