03使用 Go 记录日志

作者: 刷漆猫咪 | 来源:发表于2019-10-20 10:53 被阅读0次

    简介

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

    相关文章

      网友评论

        本文标题:03使用 Go 记录日志

        本文链接:https://www.haomeiwen.com/subject/qibomctx.html