diff --git a/README.md b/README.md index fedbb2c..93a6c1d 100644 --- a/README.md +++ b/README.md @@ -401,6 +401,10 @@ ansible-playbook ./deploy/docker/biz-bff/install.yml 生产环境环境下只能从配置中心获取配置,如果没读到,那么将无法运行 测试环境key从配置中心,也可以从本地读取配置,如果都没读到,那么将无法运行 调试环境值只从本地读取配置,如果没读到,那么将无法运行 +- 日志 + 生产环境环境下日志只输出到日志服务器 + 测试环境日志输出到本地文件和日志服务器 + 调试环境日志输出到屏幕和本地文件 #### 领域层 diff --git a/app/gomono-gateway/cmd/cmd.go b/app/gomono-gateway/cmd/cmd.go index f106f6e..e664aa5 100644 --- a/app/gomono-gateway/cmd/cmd.go +++ b/app/gomono-gateway/cmd/cmd.go @@ -53,7 +53,7 @@ var Main = gcmd.Command{ Func: func(ctx context.Context, parser *gcmd.Parser) (err error) { // 获取环境变量配置 withDebug, _ := strconv.ParseBool(os.Getenv("DEBUG")) - proxyAddrs := strings.Split(os.Getenv("PROXYADDRS"), ",") + proxyAddrs := strings.Split(os.Getenv("PROXYADDRS"), ",") // 代理地址 // 日志接口 logger := log.New(&types.SrvInfo{ ID: ID, diff --git a/app/gomono-gateway/main.go b/app/gomono-gateway/main.go index 9db5b08..cc02a7b 100644 --- a/app/gomono-gateway/main.go +++ b/app/gomono-gateway/main.go @@ -1,14 +1,6 @@ package main import ( - _ "net/http/pprof" - - _ "github.com/go-kratos/gateway/middleware/bbr" - _ "github.com/go-kratos/gateway/middleware/cors" - _ "github.com/go-kratos/gateway/middleware/logging" - _ "github.com/go-kratos/gateway/middleware/rewrite" - _ "github.com/go-kratos/gateway/middleware/tracing" - _ "github.com/go-kratos/gateway/middleware/transcoder" "github.com/gogf/gf/v2/os/gctx" "github.com/shiqinfeng1/goMono/app/gomono-bff/cmd" _ "go.uber.org/automaxprocs" diff --git a/utils/container/container.go b/utils/container/container.go index a48305b..d6dbf77 100644 --- a/utils/container/container.go +++ b/utils/container/container.go @@ -15,6 +15,7 @@ var ( ErrContainerNameInvalid = func(name string) error { return fmt.Errorf("container name invalid:%v", name) } ) +// 容器客户端 func getDockerClient() (*client.Client, error) { cli, err := client.NewClientWithOpts( client.FromEnv, @@ -27,11 +28,13 @@ func getDockerClient() (*client.Client, error) { return cli, nil } +// 获取容器名称 func GetName() (string, error) { cli, err := getDockerClient() if err != nil { return "", err } + // HOSTNAME 就是docker yaml中的hostname值 container, err := cli.ContainerInspect(context.Background(), os.Getenv("HOSTNAME")) if err != nil { return "", ErrContainerInspectFail(err) @@ -40,6 +43,7 @@ func GetName() (string, error) { return name, nil } +// 获取容器名称的前面部分,去除容器名称中系统追加的后缀 func GetNameLite() (string, error) { name, err := GetName() if err != nil { diff --git a/utils/log/log.go b/utils/log/log.go index 8d7039a..ff4444a 100644 --- a/utils/log/log.go +++ b/utils/log/log.go @@ -18,59 +18,64 @@ var ( ErrInvalidLogLevel = func(err error) error { return fmt.Errorf("invalid log level:%w", err) } ) +// 对kratos的log的封装结构 type KloggerWrap struct { - zlogger *zerolog.Logger - klogger klog.Logger - svcInfo *types.SrvInfo - f *cconf.File - m *cconf.Monitor - oldLvl zerolog.Level + zlogger *zerolog.Logger // zerolog的实例 + klogger klog.Logger // kratos的log的接口 + svcInfo *types.SrvInfo // 服务信息 + f *cconf.File // 日志文件的配置 + m *cconf.Monitor // 日志服务器的地址 + oldLvl zerolog.Level // 记录当前日志等级,在动态更新等级时,该值作为旧等级使用 } -var klogger *KloggerWrap +var kloggerWrap *KloggerWrap // 全局初始化一次 func New(svcInfo *types.SrvInfo, logCfg *cconf.Log) klog.Logger { var fileName string + // 读取日志等级 lvl, err := zerolog.ParseLevel(logCfg.Level) if err != nil { lvl = zerolog.DebugLevel } - klogger = &KloggerWrap{ + kloggerWrap = &KloggerWrap{ svcInfo: svcInfo, oldLvl: lvl, f: logCfg.File, m: logCfg.Monitor, } + // 以容器名称作为日志文件名称,用于多副本时,区分日志文件,防止写入冲突 name, err := container.GetNameLite() - if err != nil { + if err != nil { // 不是容器运行时,使用配置的名称命名 klog.Errorf("get myself container name: %v", err) fileName = fmt.Sprintf("./log/%v-%v.log", svcInfo.Name, svcInfo.ID) } else { fileName = fmt.Sprintf("./log/%v.log", name) } - klogger.zlogger = newZeroLogger(fileName, logCfg.File, logCfg.Monitor) - klogger.klogger = klog.With(zlog.NewLogger(klogger.zlogger), + // 生产一个zerolog实例 + kloggerWrap.zlogger = newZeroLogger(fileName, logCfg.File, logCfg.Monitor) + // 用kratos对zerolog进行一层包装, 带有一个全局的输出字段svc.id/name/ver" + kloggerWrap.klogger = klog.With(zlog.NewLogger(kloggerWrap.zlogger), "svc.id/name/ver", fmt.Sprintf("%v/%v/%v", svcInfo.ID, svcInfo.Name, svcInfo.Version), ) - klogger.zlogger.Level(lvl) - return klogger.klogger + // 设置zerolog的服务等级 + kloggerWrap.zlogger.Level(lvl) + return kloggerWrap.klogger } func SetLevel(lvlStr string) { - if klogger == nil { + if kloggerWrap == nil { panic(ErrNotInitedLogger) } lvl, err := zerolog.ParseLevel(lvlStr) if err != nil { - klogger.klogger.Log(klog.LevelError, "err", ErrInvalidLogLevel(err)) + kloggerWrap.klogger.Log(klog.LevelError, "err", ErrInvalidLogLevel(err)) return } - // 因为zerolog设置level后会返回一个新的logger,导致无法修改原logger的level,因此对于新的level直接new一个新的 - if klogger.oldLvl != lvl { - klogger.zlogger.Level(lvl) + if kloggerWrap.oldLvl != lvl { + kloggerWrap.zlogger.Level(lvl) } - klogger.klogger.Log(klog.LevelWarn, "msg", fmt.Sprintf("change log level '%v' to '%v'", klogger.oldLvl, lvl)) - klogger.oldLvl = lvl + kloggerWrap.klogger.Log(klog.LevelWarn, "msg", fmt.Sprintf("change log level '%v' to '%v'", kloggerWrap.oldLvl, lvl)) + kloggerWrap.oldLvl = lvl }