03使用 Go 记录日志
2019-10-20 本文已影响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