fly(2)logger实现

82 阅读4分钟

代码逻辑

package拆分

  1. fly/pkg/core/logger:该包实现最底层core-logger的包装,并提供一个默认实例,供业务代码导入后,调用,
  2. fly/pkg/logger:该包是对core-logger的封装,将core-logger提供的方法包装,并且,提供了setupLogger函数,可以实现对core-logger的定制化(业务代码可以不使用默认实例)
  3. fly/common/log: 该包是对core-logger中提供默认实例的包装,将默认实例的方法,以包级别变量的形式暴露出来,方面业务代码引用;
  4. fly/pkg/debug/log:改包实现了debug相关的更详细的logger的接口
  5. 总结:
    1. fly/pkg/core/logger 提供了logger所需的功能,和一个默认实例
    2. fly/pkg/logger 提供了对logger进行自定义实例化的功能,SetupLogger()
    3. fly/common/log 提供了对core-logger的默认实例的包装,简化业务代码调用

package: fly/pkg/core/logger

一个提供logger功能的包,应该具有哪几个部分呢?

该包应该如何使用

  1. 被导入时,就初始化一个默认的logger,比如DefaultLogger,
  2. 默认Logger的方法,包装成包级别函数暴露,提供使用
  3. 提供包级别函数,实现修改、自定义默认Logger的配置,改变默认Logger的行为

分析包应该有哪些部分组成?

答:

  1. 定义一个“logger”应该具有的功能(方法)将其抽象定义为一个接口——logger.go
  2. 抽象接口有了,应该定义一个具体的数据结构,实现这些接口——default.go
  3. 具体的数据结构,应该需要哪些字段表示?(比如这个logger要记录哪些字段 fileds、logger记录什么级别以上的:level ,输出到哪里: io.Writer等等)——options.go
  4. helper,对logger的包装,好处在哪里?
  5. 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实例

如何使用

  1. 提供一个SetupLogger()logger.Logger 函数,函数内部自定义生成logger实例,然后返回的Logger实例,记录在全局的global包中,SetupLogger函数之后,就可以在需要的业务代码中,调用不同的Logger实例了
  2. 如果是这样,那么调用中就不可以用自定义Logger实例.Info()等方法做日志记录了,因为默认logger里没有实现Info()Infof()等方法,解决方法有2:
    1. 在默认logger包里实现Info()等简化调用的方法
    2. 默认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
)

FAQ