使用 Go 記錄日誌

簡介

在上一節內容中, 咱們使用 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

相關文章
相關標籤/搜索