使用 Go 记录日志

帅气猫咪 · · 3698 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

简介

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


有疑问加站长微信联系(非本文作者)

本文来自:掘金

感谢作者:帅气猫咪

查看原文:使用 Go 记录日志

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3698 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传