使用 Go 记录日志
2016 年 2 月 18 日
简介
在上一节内容中, 我们使用 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