Logger 组件
Logger 组件我们依赖的开源包是 github.com/sirupsen/logrus
。
按照组件的设计,我们定义了自己的日志结构对其进行了组合,在保留其原生的功能之外,以便扩展。
// yago/coms/logger/logger.go
type Logger struct {
*logrus.Logger
}
所以你可以查看 logrus 官方文档 来获取所有支持的 api。
本文中仅介绍部分常用的 api 以及扩展的 api。
1. 配置日志组件
[logger]
# json | text, default text
formatter = "json"
# 日志最低等级 Panic = 0, Fatal = 1, Error = 2, Warn = 3, Info = 4, Debug = 5, Trace = 6
level = 5
# 文件路径
file_path = "./logs/app.log"
# 最大保留的备份数
max_backups = 20
# 日志最大保留天数
max_age = 30
# 文件最大大小(mb)
max_size = 500
# 是否开启压缩
compress = true
# 是否开启终端输出
# stdout_enable = true
我们在模版 app.toml 中默认配置开启了日志组件,可根据实际情况进行调整。
2. 使用日志组件
- 日志级别
// logrus 支持多种不同的日志级别,如 trace, debug, warn, error, fatal, panic
logger.Ins().Info("this is a info level msg")
logger.Ins().Infof("this is a %s level msg","info")
下面给出日志输出样例
// 其中,file, func, level, time 是 logrus 自动添加的,Info() 传递的所有信息都会被放在 msg 字段中
{"file":"home.go:23","func":"homecmd.(*HomeCmd).DemoAction","level":"info","msg":"this is a info level msg","time":"2019-11-06T14:41:50+08:00"}
- 增加日志字段
// 使用 WithField 和 WithFields 生成的日志,只作用于当条日志
logger.Ins().WithField("key","value").Info()
logger.Ins().WithFields(logrus.Fields{"key":"value"}).Info()
下面给出日志输出样例
// WithField 中的 key,会在日志中以单独的 Key 而存在,Info() 如果没有传参,msg 内容为空串
{"file":"home.go:24","func":"homecmd.(*HomeCmd).DemoAction","key":"value","level":"info","msg":"","time":"2019-11-06T14:45:22+08:00"}
- 增加全局日志字段
// 注意:使用 SetHookFields 后,所有的日志都会生效
logger.Ins().SetHookFields(logrus.Fields{"global_key":"global_value"})
- 增加日志分类字段
logger.Ins().Category("mycate")
// 上面的分类 Category 方法是对 logrus 的扩展,它等同于
logger.Ins().WithFields(logrus.Fields{"category":"mycate"})
下面给出日志输入样例
// category 会以单独的 Key 存在
{"category":"mycate","file":"home.go:23","func":"homecmd.(*HomeCmd).DemoAction","level":"info","msg":"","time":"2019-11-06T14:50:02+08:00"}