hotgo/server/internal/global/init.go

138 lines
3.3 KiB
Go
Raw Normal View History

2022-11-24 23:37:34 +08:00
// Package global
// @Link https://github.com/bufanyun/hotgo
// @Copyright Copyright (c) 2023 HotGo CLI
2022-11-24 23:37:34 +08:00
// @Author Ms <133814250@qq.com>
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
package global
import (
"context"
"fmt"
"github.com/gogf/gf/contrib/trace/jaeger/v2"
2022-12-11 20:48:18 +08:00
"github.com/gogf/gf/v2"
"github.com/gogf/gf/v2/encoding/gjson"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gctx"
"github.com/gogf/gf/v2/os/gfile"
"github.com/gogf/gf/v2/os/glog"
2022-11-24 23:37:34 +08:00
"github.com/gogf/gf/v2/os/gtime"
"github.com/gogf/gf/v2/text/gstr"
2022-12-11 20:48:18 +08:00
"hotgo/internal/consts"
"hotgo/internal/library/cache"
"hotgo/internal/library/queue"
"hotgo/internal/model/entity"
"hotgo/internal/service"
"hotgo/utility/charset"
"hotgo/utility/simple"
"runtime"
2023-02-08 20:29:34 +08:00
"strings"
2022-11-24 23:37:34 +08:00
)
func Init(ctx context.Context) {
2023-05-09 20:13:13 +08:00
// 设置服务日志处理
g.Log().SetHandlers(LoggingServeLogHandler)
2022-11-24 23:37:34 +08:00
// 默认上海时区
if err := gtime.SetTimeZone("Asia/Shanghai"); err != nil {
g.Log().Fatalf(ctx, "时区设置异常 err%+v", err)
2022-11-24 23:37:34 +08:00
return
}
fmt.Printf("欢迎使用HotGo\r\n当前运行环境%v, 运行根路径为:%v \r\nHotGo版本v%v, gf版本%v \n", runtime.GOOS, gfile.Pwd(), consts.VersionApp, gf.VERSION)
// 初始化链路追踪
InitTrace(ctx)
// 设置缓存适配器
cache.SetAdapter(ctx)
// 初始化功能库配置
service.SysConfig().InitConfig(ctx)
// 加载超管数据
service.AdminMember().LoadSuperAdmin(ctx)
// 订阅集群同步
SubscribeClusterSync(ctx)
}
// LoggingServeLogHandler 服务日志处理
// 需要将异常日志保存到服务日志时可以通过SetHandlers设置此方法
func LoggingServeLogHandler(ctx context.Context, in *glog.HandlerInput) {
in.Next(ctx)
2023-02-08 20:29:34 +08:00
err := g.Try(ctx, func(ctx context.Context) {
var err error
defer func() {
if err != nil {
panic(err)
}
}()
2023-02-08 20:29:34 +08:00
conf, err := service.SysConfig().GetLoadServeLog(ctx)
if err != nil {
return
}
2023-02-08 20:29:34 +08:00
if conf == nil {
return
}
2023-01-25 17:49:16 +08:00
2023-02-08 20:29:34 +08:00
if !conf.Switch {
return
}
2023-02-08 20:29:34 +08:00
if in.LevelFormat == "" || !gstr.InArray(conf.LevelFormat, in.LevelFormat) {
return
}
2023-02-08 20:29:34 +08:00
if in.Stack == "" {
in.Stack = in.Logger.GetStack()
2023-02-08 20:29:34 +08:00
}
2023-02-08 20:29:34 +08:00
var data entity.SysServeLog
data.TraceId = gctx.CtxId(ctx)
data.LevelFormat = in.LevelFormat
data.Content = gstr.StrLimit(in.Content, consts.MaxServeLogContentLen)
2023-02-08 20:29:34 +08:00
data.Stack = gjson.New(charset.ParseStack(in.Stack))
data.Line = strings.TrimRight(in.CallerPath, ":")
data.TriggerNs = in.Time.UnixNano()
data.Status = consts.StatusEnabled
if gstr.Contains(in.Content, `exception recovered`) {
data.LevelFormat = "PANI"
}
if data.Stack.IsNil() {
data.Stack = gjson.New(consts.NilJsonToString)
}
2023-02-08 20:29:34 +08:00
if conf.Queue {
err = queue.Push(consts.QueueServeLogTopic, data)
} else {
err = service.SysServeLog().RealWrite(ctx, data)
}
})
if err != nil {
g.Dump("LoggingServeLogHandler err:", err)
}
}
// InitTrace 初始化链路追踪
func InitTrace(ctx context.Context) {
if !g.Cfg().MustGet(ctx, "jaeger.switch").Bool() {
return
}
tp, err := jaeger.Init(simple.AppName(ctx), g.Cfg().MustGet(ctx, "jaeger.endpoint").String())
if err != nil {
g.Log().Fatal(ctx, err)
}
simple.Event().Register(consts.EventServerClose, func(ctx context.Context, args ...interface{}) {
_ = tp.Shutdown(ctx)
g.Log().Debug(ctx, "jaeger closed ..")
})
}