From 5cd7f14d02d17e0a87935183a4d57dd7f530575f Mon Sep 17 00:00:00 2001 From: John Guo Date: Tue, 17 Dec 2024 21:10:18 +0800 Subject: [PATCH] fix(net/ghttp): nil pointer panic error when server logger set nil --- net/ghttp/ghttp_server_config.go | 9 +++++++-- net/ghttp/ghttp_server_config_logging.go | 4 ++-- net/ghttp/ghttp_server_log.go | 4 ++-- net/ghttp/ghttp_z_unit_issue_test.go | 12 ++++++++++++ 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/net/ghttp/ghttp_server_config.go b/net/ghttp/ghttp_server_config.go index 450f9bb05fb..f5a6f4fe969 100644 --- a/net/ghttp/ghttp_server_config.go +++ b/net/ghttp/ghttp_server_config.go @@ -343,6 +343,9 @@ func (s *Server) SetConfigWithMap(m map[string]interface{}) error { if k, v := gutil.MapPossibleItemByKey(m, "FormParsingMemory"); k != "" { m[k] = gfile.StrToSize(gconv.String(v)) } + if _, v := gutil.MapPossibleItemByKey(m, "Logger"); v == nil { + intlog.Printf(context.TODO(), "SetConfigWithMap: set Logger nil") + } // Update the current configuration object. // It only updates the configured keys not all the object. if err := gconv.Struct(m, &s.config); err != nil { @@ -379,8 +382,10 @@ func (s *Server) SetConfig(c ServerConfig) error { return err } } - if err := s.config.Logger.SetLevelStr(s.config.LogLevel); err != nil { - intlog.Errorf(context.TODO(), `%+v`, err) + if s.config.Logger != nil { + if err := s.config.Logger.SetLevelStr(s.config.LogLevel); err != nil { + intlog.Errorf(context.TODO(), `%+v`, err) + } } gracefulEnabled = c.Graceful intlog.Printf(context.TODO(), "SetConfig: %+v", s.config) diff --git a/net/ghttp/ghttp_server_config_logging.go b/net/ghttp/ghttp_server_config_logging.go index f3e566b397e..c35edeb54eb 100644 --- a/net/ghttp/ghttp_server_config_logging.go +++ b/net/ghttp/ghttp_server_config_logging.go @@ -68,10 +68,10 @@ func (s *Server) GetLogPath() string { // IsAccessLogEnabled checks whether the access log enabled. func (s *Server) IsAccessLogEnabled() bool { - return s.config.AccessLogEnabled + return s.config.AccessLogEnabled && s.config.Logger != nil } // IsErrorLogEnabled checks whether the error log enabled. func (s *Server) IsErrorLogEnabled() bool { - return s.config.ErrorLogEnabled + return s.config.ErrorLogEnabled && s.config.Logger != nil } diff --git a/net/ghttp/ghttp_server_log.go b/net/ghttp/ghttp_server_log.go index 9f4e917dfbd..49b498ad09f 100644 --- a/net/ghttp/ghttp_server_log.go +++ b/net/ghttp/ghttp_server_log.go @@ -31,7 +31,7 @@ func (s *Server) handleAccessLog(r *Request) { r.GetClientIp(), r.Referer(), r.UserAgent(), ) logger := instance.GetOrSetFuncLock(loggerInstanceKey, func() interface{} { - l := s.Logger().Clone() + l := s.Logger() l.SetFile(s.config.AccessLogPattern) l.SetStdoutPrint(s.config.LogStdout) l.SetLevelPrint(false) @@ -73,7 +73,7 @@ func (s *Server) handleErrorLog(err error, r *Request) { content += ", " + err.Error() } logger := instance.GetOrSetFuncLock(loggerInstanceKey, func() interface{} { - l := s.Logger().Clone() + l := s.Logger() l.SetStack(false) l.SetFile(s.config.ErrorLogPattern) l.SetStdoutPrint(s.config.LogStdout) diff --git a/net/ghttp/ghttp_z_unit_issue_test.go b/net/ghttp/ghttp_z_unit_issue_test.go index d0d17b8471c..080597d0d52 100644 --- a/net/ghttp/ghttp_z_unit_issue_test.go +++ b/net/ghttp/ghttp_z_unit_issue_test.go @@ -618,3 +618,15 @@ func Test_Issue3789(t *testing.T) { t.Assert(c.GetContent(ctx, "/hello?id=&secondId=2&thirdId=3"), expect) }) } + +// https://github.com/gogf/gf/issues/4047 +func Test_Issue4047(t *testing.T) { + gtest.C(t, func(t *gtest.T) { + s := g.Server(guid.S()) + err := s.SetConfigWithMap(g.Map{ + "logger": nil, + }) + t.AssertNil(err) + t.Assert(s.Logger(), nil) + }) +}