This is an automated email from the ASF dual-hosted git repository.

baerwang pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/dubbo-go-pixiu.git


The following commit(s) were added to refs/heads/develop by this push:
     new ee4a2694 refactor: refactor the logger module (#646)
ee4a2694 is described below

commit ee4a26947c1e48b5b0990729630980b18071a61e
Author: mutezebra <[email protected]>
AuthorDate: Thu Jan 9 17:21:36 2025 +0800

    refactor: refactor the logger module (#646)
    
    * refactor: refactor the logger module
    
    * fix: supplement the previous commit
    
    * style: change name of pkg/logger/controller
    
    * style: supplementary function annotation
    
    * style: polish function annotation
---
 pkg/listener/triple/triple_listener.go |   2 +-
 pkg/logger/controller.go               | 127 +++++++++++++++++++++++++++++++++
 pkg/logger/logger.go                   |  63 +++-------------
 pkg/logger/logger_test.go              |  24 +++----
 pkg/logger/{logging.go => output.go}   |  24 +++----
 pkg/logger/triple.go                   |  59 +++++++++++++++
 6 files changed, 218 insertions(+), 81 deletions(-)

diff --git a/pkg/listener/triple/triple_listener.go 
b/pkg/listener/triple/triple_listener.go
index 0262869c..a8dc6eba 100644
--- a/pkg/listener/triple/triple_listener.go
+++ b/pkg/listener/triple/triple_listener.go
@@ -72,7 +72,7 @@ func newTripleListenerService(lc *model.Listener, bs 
*model.Bootstrap) (listener
        opts := []triConfig.OptionFunction{
                triConfig.WithCodecType(tripleConstant.HessianCodecName),
                triConfig.WithLocation(lc.Address.SocketAddress.GetAddress()),
-               triConfig.WithLogger(logger.GetLogger()),
+               triConfig.WithLogger(logger.GetTripleLogger()),
                triConfig.WithProxyModeEnable(true),
        }
 
diff --git a/pkg/logger/controller.go b/pkg/logger/controller.go
new file mode 100644
index 00000000..ce015429
--- /dev/null
+++ b/pkg/logger/controller.go
@@ -0,0 +1,127 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package logger
+
+import (
+       "strings"
+       "sync"
+
+       "go.uber.org/zap"
+       "go.uber.org/zap/zapcore"
+)
+
+// logController governs the logging output or configuration changes 
throughout the entire project.
+type logController struct {
+       mu sync.RWMutex
+
+       logger *logger
+}
+
+// setLoggerLevel safely changes the log level in a concurrent manner.
+func (c *logController) setLoggerLevel(level string) bool {
+       c.mu.Lock()
+       defer c.mu.Unlock()
+       lvl := c.parseLevel(level)
+       if lvl == nil {
+               return false
+       }
+
+       c.logger.config.Level = *lvl
+       l, _ := c.logger.config.Build()
+       c.logger = &logger{SugaredLogger: l.Sugar(), config: c.logger.config}
+       return true
+}
+
+// updateLogger safely modifies the log object in a concurrent manner.
+func (c *logController) updateLogger(l *logger) {
+       c.mu.Lock()
+       defer c.mu.Unlock()
+       c.logger = l
+}
+
+func (c *logController) debug(args ...interface{}) {
+       c.mu.RLock()
+       defer c.mu.RUnlock()
+       c.logger.Debug(args...)
+}
+
+func (c *logController) info(args ...interface{}) {
+       c.mu.RLock()
+       defer c.mu.RUnlock()
+       c.logger.Info(args...)
+}
+
+func (c *logController) warn(args ...interface{}) {
+       c.mu.RLock()
+       defer c.mu.RUnlock()
+       c.logger.Warn(args...)
+}
+
+func (c *logController) error(args ...interface{}) {
+       c.mu.RLock()
+       defer c.mu.RUnlock()
+       c.logger.Error(args...)
+}
+
+func (c *logController) debugf(fmt string, args ...interface{}) {
+       c.mu.RLock()
+       defer c.mu.RUnlock()
+       c.logger.Debugf(fmt, args...)
+}
+
+func (c *logController) infof(fmt string, args ...interface{}) {
+       c.mu.RLock()
+       defer c.mu.RUnlock()
+       c.logger.Infof(fmt, args...)
+}
+
+func (c *logController) warnf(fmt string, args ...interface{}) {
+       c.mu.RLock()
+       defer c.mu.RUnlock()
+       c.logger.Warnf(fmt, args...)
+}
+
+func (c *logController) errorf(fmt string, args ...interface{}) {
+       c.mu.RLock()
+       defer c.mu.RUnlock()
+       c.logger.Errorf(fmt, args...)
+}
+
+// parseLevel is used to parse the level of the log.
+func (c *logController) parseLevel(level string) *zap.AtomicLevel {
+       var lvl zapcore.Level
+       switch strings.ToLower(level) {
+       case "debug":
+               lvl = zapcore.DebugLevel
+       case "info":
+               lvl = zapcore.InfoLevel
+       case "warn":
+               lvl = zapcore.WarnLevel
+       case "error":
+               lvl = zapcore.ErrorLevel
+       case "panic":
+               lvl = zapcore.PanicLevel
+       case "fatal":
+               lvl = zapcore.FatalLevel
+       default:
+               return nil
+       }
+
+       al := zap.NewAtomicLevelAt(lvl)
+       return &al
+}
diff --git a/pkg/logger/logger.go b/pkg/logger/logger.go
index 38d7bbaf..9cbb49d2 100644
--- a/pkg/logger/logger.go
+++ b/pkg/logger/logger.go
@@ -21,7 +21,6 @@ import (
        "fmt"
        "os"
        "path"
-       "sync"
 )
 
 import (
@@ -34,34 +33,17 @@ import (
        "github.com/apache/dubbo-go-pixiu/pkg/common/yaml"
 )
 
-var logger Logger
+var control *logController
 
-// DubbogoPXLogger is logger struct
-type DubbogoPXLogger struct {
-       mutex sync.Mutex
-       Logger
-       dynamicLevel zap.AtomicLevel
-       // disable presents the logger state. if disable is true, the logger 
will write nothing
-       // the default value is false
-       disable bool
-}
-
-// Logger
-type Logger interface {
-       Info(args ...interface{})
-       Warn(args ...interface{})
-       Error(args ...interface{})
-       Debug(args ...interface{})
-
-       Infof(fmt string, args ...interface{})
-       Warnf(fmt string, args ...interface{})
-       Errorf(fmt string, args ...interface{})
-       Debugf(fmt string, args ...interface{})
+type logger struct {
+       *zap.SugaredLogger
+       config *zap.Config
 }
 
 func init() {
        // only use in test case, so just load default config
-       if logger == nil {
+       if control == nil {
+               control = new(logController)
                InitLogger(nil)
        }
 }
@@ -115,36 +97,13 @@ func InitLogger(conf *zap.Config) {
        } else {
                zapLoggerConfig = *conf
        }
-       zapLogger, _ := zapLoggerConfig.Build(zap.AddCallerSkip(1))
-       // logger = zapLogger.Sugar()
-       logger = &DubbogoPXLogger{Logger: zapLogger.Sugar(), dynamicLevel: 
zapLoggerConfig.Level}
-}
-
-func SetLogger(log Logger) {
-       logger = log
-}
+       zapLogger, _ := zapLoggerConfig.Build(zap.AddCallerSkip(2))
+       l := &logger{zapLogger.Sugar(), &zapLoggerConfig}
 
-func GetLogger() Logger {
-       return logger
+       control.updateLogger(l)
 }
 
+// SetLoggerLevel safely changes the log level in a concurrent manner.
 func SetLoggerLevel(level string) bool {
-       if l, ok := logger.(OpsLogger); ok {
-               l.SetLoggerLevel(level)
-               return true
-       }
-       return false
-}
-
-type OpsLogger interface {
-       Logger
-       // SetLoggerLevel function as name
-       SetLoggerLevel(level string)
-}
-
-// SetLoggerLevel ...
-func (dpl *DubbogoPXLogger) SetLoggerLevel(level string) {
-       l := new(zapcore.Level)
-       l.Set(level)
-       dpl.dynamicLevel.SetLevel(*l)
+       return control.setLoggerLevel(level)
 }
diff --git a/pkg/logger/logger_test.go b/pkg/logger/logger_test.go
index 9d1547b9..561cc4d7 100644
--- a/pkg/logger/logger_test.go
+++ b/pkg/logger/logger_test.go
@@ -66,18 +66,18 @@ func TestInitLog(t *testing.T) {
        Errorf("%s", "error")
 }
 
-func TestSetLevel(t *testing.T) {
-       err := InitLog("./log.yml")
-       assert.NoError(t, err)
-       Debug("debug")
-       Info("info")
+func TestSetLoggerLevel(t *testing.T) {
+       assert.NotNil(t, control, "control should not be nil")
 
-       assert.True(t, SetLoggerLevel("info"))
-       Debug("debug")
-       Info("info")
+       assert.True(t, SetLoggerLevel("info"), "when pass info to 
SetLoggerLevel, result should be true")
+       assert.True(t, SetLoggerLevel("debug"), "when pass debug to 
SetLoggerLevel, result should be true")
+       assert.True(t, SetLoggerLevel("error"), "when pass error to 
SetLoggerLevel, result should be true")
+       assert.True(t, SetLoggerLevel("panic"), "when pass panic to 
SetLoggerLevel, result should be true")
+       assert.True(t, SetLoggerLevel("INFO"), "when pass INFO to 
SetLoggerLevel, result should be true")
+       assert.True(t, SetLoggerLevel("DEbug"), "when pass DEbug to 
SetLoggerLevel, result should be true")
+       assert.True(t, SetLoggerLevel("ErRor"), "when pass ErRor to 
SetLoggerLevel, result should be true")
+       assert.True(t, SetLoggerLevel("WaRN"), "when pass WaRN to 
SetLoggerLevel, result should be true")
 
-       SetLogger(GetLogger().(*DubbogoPXLogger).Logger)
-       assert.False(t, SetLoggerLevel("debug"))
-       Debug("debug")
-       Info("info")
+       assert.False(t, SetLoggerLevel("i"), "when pass i to SetLoggerLevel, 
result should be false")
+       assert.False(t, SetLoggerLevel(""), "when pass nothing to 
SetLoggerLevel, result should be false")
 }
diff --git a/pkg/logger/logging.go b/pkg/logger/output.go
similarity index 80%
rename from pkg/logger/logging.go
rename to pkg/logger/output.go
index b14cdbfd..10b2f96c 100644
--- a/pkg/logger/logging.go
+++ b/pkg/logger/output.go
@@ -17,42 +17,34 @@
 
 package logger
 
-// Info
 func Info(args ...interface{}) {
-       logger.Info(args...)
+       control.info(args...)
 }
 
-// Warn
 func Warn(args ...interface{}) {
-       logger.Warn(args...)
+       control.warn(args...)
 }
 
-// Error
 func Error(args ...interface{}) {
-       logger.Error(args...)
+       control.error(args...)
 }
 
-// Debug
 func Debug(args ...interface{}) {
-       logger.Debug(args...)
+       control.debug(args...)
 }
 
-// Infof
 func Infof(fmt string, args ...interface{}) {
-       logger.Infof(fmt, args...)
+       control.infof(fmt, args...)
 }
 
-// Warnf
 func Warnf(fmt string, args ...interface{}) {
-       logger.Warnf(fmt, args...)
+       control.warnf(fmt, args...)
 }
 
-// Errorf
 func Errorf(fmt string, args ...interface{}) {
-       logger.Errorf(fmt, args...)
+       control.errorf(fmt, args...)
 }
 
-// Debugf
 func Debugf(fmt string, args ...interface{}) {
-       logger.Debugf(fmt, args...)
+       control.debugf(fmt, args...)
 }
diff --git a/pkg/logger/triple.go b/pkg/logger/triple.go
new file mode 100644
index 00000000..fb893fc6
--- /dev/null
+++ b/pkg/logger/triple.go
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package logger
+
+// TripleLogger does not add user-defined log fields, so there will be no 
pointer
+// reference issues after updates, ensuring that all references are under 
control.
+type TripleLogger struct {
+}
+
+func GetTripleLogger() *TripleLogger {
+       return &TripleLogger{}
+}
+
+func (l *TripleLogger) Info(args ...interface{}) {
+       control.info(args...)
+}
+
+func (l *TripleLogger) Warn(args ...interface{}) {
+       control.warn(args...)
+}
+
+func (l *TripleLogger) Error(args ...interface{}) {
+       control.error(args...)
+}
+
+func (l *TripleLogger) Debug(args ...interface{}) {
+       control.debug(args...)
+}
+
+func (l *TripleLogger) Infof(fmt string, args ...interface{}) {
+       control.infof(fmt, args...)
+}
+
+func (l *TripleLogger) Warnf(fmt string, args ...interface{}) {
+       control.warnf(fmt, args...)
+}
+
+func (l *TripleLogger) Errorf(fmt string, args ...interface{}) {
+       control.errorf(fmt, args...)
+}
+
+func (l *TripleLogger) Debugf(fmt string, args ...interface{}) {
+       control.debugf(fmt, args...)
+}

Reply via email to