阅读 2275

使用 Go 记录日志

简介

在上一节内容中, 我们使用 viper 读取了配置文件.

本节将使用 logrus 记录日志.

logrus 是一个结构化的日志记录器, 和标准库中的 logger 具有完全兼容的 API.

定义配置

首先, 更新一下配置文件, 加入以下参数:

log:
  use_json: true
  logger_level: debug
  logger_file: log/server.log
  gin_file: log/gin.log
  gin_console: true
复制代码

logrus 支持使用 JSON 格式记录日志:

logrus.SetFormatter(&log.JSONFormatter{})
复制代码

第二三参数设置了日志的记录级别和日志保存路径, 最后两个参数是 gin 的日志设置参数.

读取日志相关的配置

// 初始化日志
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)
}
复制代码

这方法就是读取了日志相关的配置参数, 然后调用对应的方法.

那么在哪里调用这个方法呢?

目前我是在 initConfig 中调用的, 这使得日志配置在初始化时就固定了, 因此当调整配置文件时不会影响日志相关的配置.

如果需要实时更新日志配置, 可以考虑放在 runServer 中.

总结

和原作者不同的地方在于, 我没有考虑日志的压缩与转储.

另外一点是没有统一处理 gin 的日志, 选择了分散处理.

当前部分的代码

作为版本 v0.3.0

文章分类
阅读
文章标签