diff --git a/server/core/viper.go b/server/core/viper.go index 9a7ccc37df70b7c9d0670c0f29e2d2dd989a62ad..d6743d4577baabb543d6fab6214e1470d556b123 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 { diff --git a/server/core/zap.go b/server/core/zap.go index 350563255a958f1923960d557f1e3a57e9dbc2df..408aad86de5dcf0e42abb9532327a73d5f7fcf94 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 0000000000000000000000000000000000000000..a32af153d93a84fcecc9360676141ca4f5eba388 --- /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