// Package global // @Link https://github.com/bufanyun/hotgo // @Copyright Copyright (c) 2023 HotGo CLI // @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" "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" "github.com/gogf/gf/v2/os/gtime" "github.com/gogf/gf/v2/text/gstr" "hotgo/internal/consts" "hotgo/internal/library/cache" "hotgo/internal/library/queue" "hotgo/internal/model/entity" "hotgo/internal/service" "hotgo/utility/charset" "hotgo/utility/simple" "strings" ) func Init(ctx context.Context) { // 设置服务日志处理 g.Log().SetHandlers(LoggingServeLogHandler) // 默认上海时区 if err := gtime.SetTimeZone("Asia/Shanghai"); err != nil { g.Log().Fatalf(ctx, "时区设置异常 err:%+v", err) return } RootPtah = gfile.Pwd() fmt.Printf("欢迎使用HotGo!\r\n当前运行环境:%v, 运行根路径为:%v \r\nHotGo版本:v%v, gf版本:%v \n", SysType, RootPtah, 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) err := g.Try(ctx, func(ctx context.Context) { var err error defer func() { if err != nil { panic(err) } }() conf, err := service.SysConfig().GetLoadServeLog(ctx) if err != nil { return } if conf == nil { return } if !conf.Switch { return } if in.LevelFormat == "" || !gstr.InArray(conf.LevelFormat, in.LevelFormat) { return } if in.Stack == "" { in.Stack = in.Logger.GetStack() } var data entity.SysServeLog data.TraceId = gctx.CtxId(ctx) data.LevelFormat = in.LevelFormat data.Content = in.Content data.Stack = gjson.New(charset.ParseStack(in.Stack)) data.Line = strings.TrimRight(in.CallerPath, ":") data.TriggerNs = in.Time.UnixNano() data.Status = consts.StatusEnabled if data.Stack.IsNil() { data.Stack = gjson.New(consts.NilJsonToString) } if gstr.Contains(in.Content, `exception recovered`) { data.LevelFormat = "PANI" } if conf.Queue { err = queue.Push(consts.QueueServeLogTopic, data) } else { err = service.SysServeLog().RealWrite(ctx, data) } }) if err != nil { g.Dump("LoggingServeLogHandler err:%+v", err) } } // InitTrace 初始化链路追踪 func InitTrace(ctx context.Context) { JaegerSwitch = g.Cfg().MustGet(ctx, "jaeger.switch").Bool() if !JaegerSwitch { 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 ..") }) }