前面演示了go web项目,这里我们再进行改造下,使用zap这个比较流行的日志框架来处理整个go web中打印的日志信息。这里我们尽量使用java开发的经验来演化go web的相关模块。因为日志这块对于我们来说,经常会涉及到日志文件大小的切割等。这些都是日常项目非常重要的部分。下面直接开始演示。
一、安装依赖
使用zap的话,我们需要安装zap的依赖
go get -u github.com/natefinch/lumberjack go get -u go.uber.org/zap
二、编写zap logger的初始化方法
在程序启动的时候,我们就会初始化zap logger,所以这里我们在config.go下面编写对应的初始化代码,示例如下:
var Logger *zap.SugaredLogger func InitLogger(file string) { //配置zaplogger的日志输出格式 encoderConfig := zapcore.EncoderConfig{ TimeKey: "time", LevelKey: "level", NameKey: "logger", CallerKey: "caller", MessageKey: "msg", StacktraceKey: "stacktrace", LineEnding: zapcore.DefaultLineEnding, EncodeLevel: zapcore.LowercaseLevelEncoder, EncodeTime: zapcore.TimeEncoderOfLayout("2006-01-02 15:04:05.000"), EncodeDuration: zapcore.SecondsDurationEncoder, } //配置每个日志文件设置多大,超过就自动切割,并且压缩 hook := lumberjack.Logger{ Filename: file, // ⽇志⽂件路径 MaxSize: 100, // 单个日志文件最大100MB MaxBackups: 3, // 最多保留3个备份 MaxAge: 7, //days Compress: true, // 是否压缩 disabled by default } // 创建zapcore核心输出器 core := zapcore.NewCore( zapcore.NewJSONEncoder(encoderConfig), zapcore.AddSync(&hook), zapcore.InfoLevel, ) //创建zaplogger logger := zap.New(core) Logger = logger.Sugar() defer Logger.Sync() }
三、使用zap替换gin的输出
由于gin框架也会自己输出日志,我们要求使用zap直接替代掉。在gin里面,替代gin的日志输出主要是通过中间件来完成的,所以这里我们在编写一个替换gin输出的方法,示例代码如下:
/*
*
用来接管gin框架的日志输出
*/
func GeneratorLogger() gin.HandlerFunc {
return func(c *gin.Context) {
start := time.Now()
c.Next()
elapsed := time.Since(start)
message := fmt.Sprintf("%s | %s | %s | %s | %d | %dms",
time.Now().Format("2006-01-02 15:04:05"),
c.ClientIP(),
c.Request.URL,
c.Request.Method,
c.Writer.Status(),
int64(elapsed/time.Millisecond))
Logger.Info(message)
}
}此方法目前我们也写在config.go文件中。
四、初始化
最后我们在main.go代码里面注释掉之前的log输出信息,
func main() {
//f, _ := os.Create("gin.log")
//log.SetOutput(f)
//gin.DefaultWriter = io.MultiWriter(f)
//defer f.Close()
//关闭gin的日志输出
gin.DefaultWriter = io.Discard
//注册验证器
config.InitValidate()
//注册日志
config.InitLogger("gin.log")
//注册链接数据库
config.ConnectDatabase()
//注册链接redis
config.ConnectRedis()
r := routes.SetupRouter()
config.Logger.Info("服务器启动完成")
r.Run(":48080")
}然后在routes.go代码里面添加gin的中间件:
r.Use(config.GeneratorLogger(), middleware.GlobalErrorMiddleware())
五、使用zap输出日志
接下来在我们想要打日志的地方输出对应的日志即可,例如:
config.Logger.Info(fmt.Sprintf("当前用户 %s 登录成功。 密码是: %s", loginRequest.Username, loginRequest.Password))这里需要注意,当使用多个占位符拼接字符串打日志的时候,要使用fmt.Sprintf()函数。
六、测试
接下来我们使用api-post压测下login接口,可以看到日志超过一定大小之后被切割并且压缩了,如下图:
是不是非常方便了。
最后按照惯例,附上本案例的源码,登录后即可下载。




还没有评论,来说两句吧...