1

简介

在上一节内容中, 我们使用 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


帅气猫咪
105 声望13 粉丝