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












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