前面演示了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接口,可以看到日志超过一定大小之后被切割并且压缩了,如下图:
是不是非常方便了。
最后按照惯例,附上本案例的源码,登录后即可下载。
还没有评论,来说两句吧...