diff --git a/config/config.go b/config/config.go index ecf6652..925fbaa 100644 --- a/config/config.go +++ b/config/config.go @@ -37,3 +37,8 @@ type ( Mode string `json:",default=dev,options=[dev,test,prod]"` } ) + +// ShallLogDebug 是否应该打印 Debug 级别的日志,打印的首要条件是 nlog 的打印级别为 debug +func ShallLogDebug(mode string) bool { + return mode == DevMode || mode == TestMode +} diff --git a/core/connection.go b/core/connection.go index b47e8a7..97f6703 100644 --- a/core/connection.go +++ b/core/connection.go @@ -141,7 +141,10 @@ func (r *connection) write() { close(r.chWrite) _ = r.Close() - nlog.Debugf("[writeLoop] connection write goroutine exit, ConnID=%d, SessionUID=%s", r.ID(), r.session.UID()) + if r.ngin.shallLogDebug() { + nlog.Debugf("%s [writeLoop] connection write goroutine exit, ConnID=%d, SessionUID=%s", + r.ngin.logPrefix(), r.ID(), r.session.UID()) + } }() for { @@ -150,13 +153,13 @@ func (r *connection) write() { // marshal packet body (data) if r.ngin.serializer == nil { if _, ok := data.payload.([]byte); !ok { - nlog.Errorf("serializer is nil, but payload type not []byte") + nlog.Errorf("%s serializer is nil, but payload type not []byte", r.ngin.logPrefix()) break } } else { payload, err := r.ngin.serializer.Marshal(data.payload) if err != nil { - nlog.Errorf("message body marshal err: %v", err) + nlog.Errorf("%s message body marshal err: %v", r.ngin.logPrefix(), err) break } data.payload = payload @@ -166,21 +169,21 @@ func (r *connection) write() { if pipe := r.ngin.pipeline; pipe != nil { err := pipe.Outbound().Process(r, data) if err != nil { - nlog.Errorf("pipeline err: %s", err.Error()) + nlog.Errorf("%s pipeline err: %s", r.ngin.logPrefix(), err.Error()) } } // packet pack data p, err := r.packer.Pack(data.header, data.payload.([]byte)) if err != nil { - nlog.Error(err.Error()) + nlog.Errorf("%s pack err: %s", r.ngin.logPrefix(), err.Error()) break } r.chWrite <- p case data := <-r.chWrite: // 回写数据 if _, err := r.conn.Write(data); err != nil { - nlog.Error(err.Error()) + nlog.Errorf("%s write data err: %s", r.ngin.logPrefix(), err.Error()) break } //nlog.Debugf("write data %v", data) @@ -202,24 +205,25 @@ func (r *connection) read() { n, err := r.conn.Read(buf) //nlog.Debugf("receive data %v", buf[:n]) if err != nil { - nlog.Errorf("[readLoop] Read message error: %s, session will be closed immediately", err.Error()) + nlog.Errorf("%s [readLoop] Read message error: %s, session will be closed immediately", + r.ngin.logPrefix(), err.Error()) return } if r.packer == nil { - nlog.Errorf("[readLoop] unexpected error: packer is nil") + nlog.Errorf("%s [readLoop] unexpected error: packer is nil", r.ngin.logPrefix()) return } // warning: 为性能考虑,复用slice处理数据,buf传入后必须要copy再处理 packets, err := r.packer.Unpack(buf[:n]) if err != nil { - nlog.Error(err.Error()) + nlog.Errorf("%s unpack err: %s", r.ngin.logPrefix(), err.Error()) } // packets 处理 for _, p := range packets { if err := r.processPacket(p); err != nil { - nlog.Error(err.Error()) + nlog.Errorf("%s process packet err: %s", r.ngin.logPrefix(), err.Error()) continue } } @@ -249,7 +253,9 @@ func (r *connection) Close() error { } r.SetStatus(StatusClosed) - nlog.Debugf("close connection, ID: %d", r.ID()) + if r.ngin.shallLogDebug() { + nlog.Debugf("%s close connection, ID: %d", r.ngin.logPrefix(), r.ID()) + } select { case <-r.chDie: diff --git a/core/engine.go b/core/engine.go index 4d2b95f..e2f79d5 100644 --- a/core/engine.go +++ b/core/engine.go @@ -2,6 +2,7 @@ package core import ( "errors" + "fmt" "git.noahlan.cn/noahlan/nnet/config" conn2 "git.noahlan.cn/noahlan/nnet/conn" "git.noahlan.cn/noahlan/nnet/entity" @@ -15,10 +16,7 @@ import ( "log" "net" "net/http" - "os" - "os/signal" "strings" - "syscall" "time" ) @@ -34,9 +32,11 @@ func NotFoundHandler() Handler { type ( // engine TCP-engine engine struct { - conf config.EngineConf // conf 配置 - middlewares []Middleware // 中间件 - routes []Route // 路由 + conf config.EngineConf // conf 配置 + taskTimerPrecision time.Duration + + middlewares []Middleware // 中间件 + routes []Route // 路由 // handler 消息处理器 handler Handler // dieChan 应用程序退出信号 @@ -49,8 +49,7 @@ type ( wsOpt wsOptions // websocket - taskTimerPrecision time.Duration - connManager *conn2.Manager + connManager *conn2.Manager } wsOptions struct { @@ -72,12 +71,19 @@ func newEngine(conf config.EngineConf) *engine { taskTimerPrecision: conf.TaskTimerPrecision, connManager: conn2.NewManager(), } - pool.InitPool(conf.Pool) return s } +func (ng *engine) shallLogDebug() bool { + return config.ShallLogDebug(ng.conf.Mode) +} + +func (ng *engine) logPrefix() string { + return fmt.Sprintf("[NNet-%s]", ng.conf.Name) +} + func (ng *engine) use(middleware ...Middleware) { ng.middlewares = append(ng.middlewares, middleware...) } @@ -132,7 +138,9 @@ func (ng *engine) dial(addr string, router Router) (entity.NetworkEntity, error) nlog.Must(err) // 连接成功,客户端已启动 - nlog.Infof("now connect to %s.", addr) + if ng.shallLogDebug() { + nlog.Debugf("now connect to %s.", addr) + } return c, nil } @@ -145,7 +153,7 @@ func (ng *engine) serve(router Router) error { } go scheduler.Schedule(ng.taskTimerPrecision) defer func() { - nlog.Info("NNet is stopping...") + nlog.Infof("%s is stopping...", ng.logPrefix()) ng.shutdown() scheduler.Close() @@ -161,16 +169,6 @@ func (ng *engine) serve(router Router) error { ng.listenAndServe() } - sg := make(chan os.Signal) - signal.Notify(sg, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGKILL, syscall.SIGTERM) - - select { - case <-ng.dieChan: - nlog.Info("NNet will shutdown in a few seconds") - case s := <-sg: - nlog.Infof("NNet got signal: %s", s) - } - return nil } @@ -186,7 +184,9 @@ func (ng *engine) listenAndServe() { nlog.Must(err) // 监听成功,服务已启动 - nlog.Infof("now listening %s on %s.", ng.conf.Protocol, ng.conf.Addr) + if ng.shallLogDebug() { + nlog.Debugf("%s now listening %s at %s.", ng.logPrefix(), ng.conf.Protocol, ng.conf.Addr) + } defer func() { _ = listener.Close() ng.close() @@ -196,10 +196,10 @@ func (ng *engine) listenAndServe() { conn, err := listener.Accept() if err != nil { if errors.Is(err, net.ErrClosed) { - nlog.Errorf("服务器网络错误 %+v", err) + nlog.Errorf("%s 服务器网络错误 %+v", ng.logPrefix(), err) return } - nlog.Errorf("监听错误 %v", err) + nlog.Errorf("%s 监听错误 %v", ng.logPrefix(), err) continue } @@ -207,7 +207,7 @@ func (ng *engine) listenAndServe() { ng.handle(conn) }) if err != nil { - nlog.Errorf("submit conn pool err: %ng", err.Error()) + nlog.Errorf("%s submit conn pool err: %ng", ng.logPrefix(), err.Error()) continue } } @@ -215,6 +215,9 @@ func (ng *engine) listenAndServe() { func (ng *engine) listenAndServeWS() { ng.setupWS() + if ng.shallLogDebug() { + nlog.Debugf("%s now listening websocket at %s.", ng.logPrefix(), ng.conf.Addr) + } if err := http.ListenAndServe(ng.conf.Addr, nil); err != nil { log.Fatal(err.Error()) } @@ -222,6 +225,9 @@ func (ng *engine) listenAndServeWS() { func (ng *engine) listenAndServeWSTLS() { ng.setupWS() + if ng.shallLogDebug() { + nlog.Debugf("%s now listening websocket with tls at %s.", ng.logPrefix(), ng.conf.Addr) + } if err := http.ListenAndServeTLS(ng.conf.Addr, ng.wsOpt.TLSCertificate, ng.wsOpt.TLSKey, nil); err != nil { log.Fatal(err.Error()) } @@ -236,14 +242,14 @@ func (ng *engine) setupWS() { http.HandleFunc("/"+strings.TrimPrefix(ng.wsOpt.WebsocketPath, "/"), func(w http.ResponseWriter, r *http.Request) { conn, err := upgrade.Upgrade(w, r, nil) if err != nil { - nlog.Errorf("Upgrade failure, URI=%ng, Error=%ng", r.RequestURI, err.Error()) + nlog.Errorf("%s Upgrade failure, URI=%ng, Error=%ng", ng.logPrefix(), r.RequestURI, err.Error()) return } err = pool.Submit(func() { ng.handleWS(conn) }) if err != nil { - log.Fatalf("submit conn pool err: %ng", err.Error()) + log.Fatalf("%s submit conn pool err: %v", ng.logPrefix(), err.Error()) } }) }