From a15b9e8d42f93a581f5073ab825d4f67d4153eb0 Mon Sep 17 00:00:00 2001 From: arbullzhang Date: Mon, 5 Jul 2021 14:28:50 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=AF=B9viper=E5=9B=BA=E6=9C=89bug?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/core/viper.go | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/server/core/viper.go b/server/core/viper.go index 9a7ccc37..d6743d45 100644 --- a/server/core/viper.go +++ b/server/core/viper.go @@ -8,11 +8,23 @@ import ( "gin-vue-admin/utils" "os" "path/filepath" + "time" "github.com/fsnotify/fsnotify" "github.com/spf13/viper" ) +// 由于 vipver 包本身对于文件的变化事件有一个bug,相关事件会被回调两次 +// 常年未彻底解决,相关的 issue 清单:https://github.com/spf13/viper/issues?q=OnConfigChange +// 设置一个内部全局变量,记录配置文件变化时的时间点,如果两次回调事件事件差小于1秒,我们认为是第二次回调事件,而不是人工修改配置文件 +// 这样就避免了 vipver 包的这个bug + +var lastChangeTime time.Time + +func init() { + lastChangeTime = time.Now() +} + func Viper(path ...string) *viper.Viper { var config string if len(path) == 0 { @@ -44,9 +56,11 @@ func Viper(path ...string) *viper.Viper { v.WatchConfig() v.OnConfigChange(func(e fsnotify.Event) { - fmt.Println("config file changed:", e.Name) - if err := v.Unmarshal(&global.GVA_CONFIG); err != nil { - fmt.Println(err) + if time.Now().Sub(lastChangeTime).Seconds() >= 1 { //前后大于1秒钟,就认为确实是在更新 + fmt.Println("config file changed:", e.Name) + if err := v.Unmarshal(&global.GVA_CONFIG); err != nil { + fmt.Println(err) + } } }) if err := v.Unmarshal(&global.GVA_CONFIG); err != nil { -- Gitee From 261addaf64fbd4298f552d717722df14e5716f0f Mon Sep 17 00:00:00 2001 From: arbullzhang Date: Mon, 5 Jul 2021 15:01:37 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E9=92=A9=E5=AD=90=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/core/zap.go | 2 ++ server/utils/zap_log_hooks.go | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 server/utils/zap_log_hooks.go diff --git a/server/core/zap.go b/server/core/zap.go index 35056325..408aad86 100644 --- a/server/core/zap.go +++ b/server/core/zap.go @@ -45,6 +45,8 @@ func Zap() (logger *zap.Logger) { if global.GVA_CONFIG.Zap.ShowLine { logger = logger.WithOptions(zap.AddCaller()) } + logger.WithOptions(zap.Hooks(utils.ZapLogHandler)) //增加日志钩子处理函数 + return logger } diff --git a/server/utils/zap_log_hooks.go b/server/utils/zap_log_hooks.go new file mode 100644 index 00000000..a32af153 --- /dev/null +++ b/server/utils/zap_log_hooks.go @@ -0,0 +1,24 @@ +package utils + +import "go.uber.org/zap/zapcore" + +// GoSkeleton 系统运行日志钩子函数 +// 1.单条日志就是一个结构体格式,本函数拦截每一条日志,您可以进行后续处理,例如:推送到阿里云日志管理面板、ElasticSearch 日志库等 + +func ZapLogHandler(entry zapcore.Entry) error { + + // 参数 entry 介绍 + // entry 参数就是单条日志结构体,主要包括字段如下: + //Level 日志等级 + //Time 当前时间 + //LoggerName 日志名称 + //Message 日志内容 + //Caller 各个文件调用路径 + //Stack 代码调用栈 + + go func(paramEntry zapcore.Entry) { + //fmt.Println(" GoSkeleton hook ....,你可以在这里继续处理系统日志....") + //fmt.Printf("%#+v\n", paramEntry) + }(entry) + return nil +} \ No newline at end of file -- Gitee