代码逻辑
package拆分
- fly/pkg/core/logger:该包实现最底层core-logger的包装,并提供一个默认实例,供业务代码导入后,调用,
- fly/pkg/logger:该包是对core-logger的封装,将core-logger提供的方法包装,并且,提供了setupLogger函数,可以实现对core-logger的定制化(业务代码可以不使用默认实例)
- fly/common/log: 该包是对core-logger中提供默认实例的包装,将默认实例的方法,以包级别变量的形式暴露出来,方面业务代码引用;
- fly/pkg/debug/log:改包实现了debug相关的更详细的logger的接口
- 总结:
- fly/pkg/core/logger 提供了logger所需的功能,和一个默认实例
- fly/pkg/logger 提供了对logger进行自定义实例化的功能,SetupLogger()
- fly/common/log 提供了对core-logger的默认实例的包装,简化业务代码调用
package: fly/pkg/core/logger
一个提供logger功能的包,应该具有哪几个部分呢?
该包应该如何使用
- 被导入时,就初始化一个默认的logger,比如DefaultLogger,
- 默认Logger的方法,包装成包级别函数暴露,提供使用
- 提供包级别函数,实现修改、自定义默认Logger的配置,改变默认Logger的行为
分析包应该有哪些部分组成?
答:
- 定义一个“logger”应该具有的功能(方法)将其抽象定义为一个接口——logger.go
- 抽象接口有了,应该定义一个具体的数据结构,实现这些接口——default.go
- 具体的数据结构,应该需要哪些字段表示?(比如这个logger要记录哪些字段 fileds、logger记录什么级别以上的:level ,输出到哪里: io.Writer等等)——options.go
- helper,对logger的包装,好处在哪里?
- context,不理解?
组成部分的具体函数、方法、变量、接口等定义
logger/
loggger.go
default.go
options.go
helper.go
level.go
context.go
logger.go
// 应该有的方法?
/*
初始化logger的实例Init()
通过logger实例记录日志Log()
通过logger实例格式化记录日志Logf()
返回logger实例的名称 String()
返回logger实例的所有选项配置Options()
给logger实例设置一些选项配置到Options里,扩展logger的属性Fields()
*/
var DefaultLogger Logger // 初始化一个Logger接口的空容器,最终一定会在init()函数中给它赋值一个具体实例的
type Logger interface {
Init()
Log()
Logf()
String()
Options()
Fields()
}
default.go
/*
应该有?
具体的数据结构,比如defaultLogger
数据结构实现logger接口的6个方法
具体数据结构的一个构造函数,
init()函数中,调用构造函数,依据默认配置选项,实例化一个默认的logger实例,并赋值给logger.go文件中的DefaultLogger
*/
```shell
#### options.go
```shell
/*
应该有?
定义一个结构体,记录logger实例化所需的信息
*/
helper.go
level.go
/*
应该有?
包级别方法暴露,比如Info()Debug(),内部就是对默认DefaultLogger的方法的封装调用
*/
context.go
context.go
package: fly/pkg/logger
功能
包装了fly/pkg/core/logger的默认logger,以包级别函数暴露默认logger的方法,简化调用,业务代码调用本包的函数,实际是使用的是fly/pkg/core/logger中默认logger实例的方法,实际就提供一个SetupLogger函数,可以根据配置,生成自定义logger实例
如何使用
- 提供一个SetupLogger()logger.Logger 函数,函数内部自定义生成logger实例,然后返回的Logger实例,记录在全局的global包中,SetupLogger函数之后,就可以在需要的业务代码中,调用不同的Logger实例了
- 如果是这样,那么调用中就不可以用自定义Logger实例.Info()等方法做日志记录了,因为默认logger里没有实现Info()Infof()等方法,解决方法有2:
- 在默认logger包里实现Info()等简化调用的方法
- 默认logger包外再包装一层,体现为fly/pkg/logger的一个数据结构,并在此数据上,实现Info()等简化调用方法
package: fly/common/log
功能
包装了fly/pkg/core/logger的默认logger,以包级别函数暴露默认logger的方法,简化调用,业务代码调用本包的函数,实际是使用的是fly/pkg/core/logger中默认logger实例的方法
package log
import "fly/pkg/core/logger"
var (
Trace = logger.Trace
Tracef = logger.Tracef
Debug = logger.Debug
Debugf = logger.Debugf
Info = logger.Info
Infof = logger.Infof
Warn = logger.Warn
Warnf = logger.Warnf
Error = logger.Error
Errorf = logger.Errorf
Fatal = logger.Fatal
Fatalf = logger.Fatalf
)