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 b590ac6e feat: added the ability to pull the logger configuration from 
nacos at program startup (#640)
b590ac6e is described below

commit b590ac6ec23b585ffe1d70c81f18509d1f93687c
Author: mutezebra <[email protected]>
AuthorDate: Thu Dec 5 14:27:17 2024 +0800

    feat: added the ability to pull the logger configuration from nacos at 
program startup (#640)
    
    * feat: added the ability to pull the logger configuration from nacos at 
program startup
    
    * style: change code station
---
 configcenter/nacos_load.go |   1 -
 configs/conf.yaml          |  29 ++++++++
 pkg/cmd/gateway.go         |   8 +++
 pkg/model/bootstrap.go     |   1 +
 pkg/model/log.go           | 169 +++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 207 insertions(+), 1 deletion(-)

diff --git a/configcenter/nacos_load.go b/configcenter/nacos_load.go
index 8ec96901..84681a8e 100644
--- a/configcenter/nacos_load.go
+++ b/configcenter/nacos_load.go
@@ -97,7 +97,6 @@ func NewNacosConfig(boot *model.Bootstrap) (configClient 
ConfigClient, err error
 }
 
 func (n *NacosConfig) LoadConfig(param map[string]interface{}) (string, error) 
{
-
        return n.client.GetConfig(vo.ConfigParam{
                DataId: getOrDefault(param[KeyDataId].(string), DataId),
                Group:  getOrDefault(param[KeyGroup].(string), Group),
diff --git a/configs/conf.yaml b/configs/conf.yaml
index ecaf8b70..3f4f4a3a 100644
--- a/configs/conf.yaml
+++ b/configs/conf.yaml
@@ -65,3 +65,32 @@ static_resources:
     timeout: "60s"
     step_timeout: "10s"
     reject_policy: "immediacy"
+
+log:
+  level: "debug"
+  development: true
+  disableCaller: false
+  disableStacktrace: false
+  sampling:
+  encoding: "console"
+
+  # encoder
+  encoderConfig:
+    messageKey: "message"
+    levelKey: "level"
+    timeKey: "time"
+    nameKey: "logger"
+    callerKey: "caller"
+    stacktraceKey: "stacktrace"
+    lineEnding: ""
+    levelEncoder: "capitalColor"
+    timeEncoder: "iso8601"
+    durationEncoder: "seconds"
+    callerEncoder: "short"
+    nameEncoder: ""
+
+  outputPaths:
+    - "stderr"
+  errorOutputPaths:
+    - "stderr"
+  initialFields:
diff --git a/pkg/cmd/gateway.go b/pkg/cmd/gateway.go
index 68eae852..9dc4ff69 100644
--- a/pkg/cmd/gateway.go
+++ b/pkg/cmd/gateway.go
@@ -118,6 +118,8 @@ func (d *DefaultDeployer) initialize() error {
        // load Bootstrap config
        d.bootstrap = d.configManger.LoadBootConfig(configPath)
 
+       initLogWithConfig(d.bootstrap)
+
        err = initLimitCpus()
        if err != nil {
                logger.Errorf("[startCmd] failed to get limit cpu number, %s", 
err.Error())
@@ -180,6 +182,12 @@ func initLog() error {
        return nil
 }
 
+func initLogWithConfig(boot *model.Bootstrap) {
+       if boot.Log != nil {
+               logger.InitLogger(boot.Log.Build())
+       }
+}
+
 // initApiConfig return value of the bool is for the judgment of whether is a 
api meta data error, a kind of silly (?)
 func initApiConfig() (*model.Bootstrap, error) {
        bootstrap := config.Load(configPath)
diff --git a/pkg/model/bootstrap.go b/pkg/model/bootstrap.go
index 6e78aa63..a5b658f4 100644
--- a/pkg/model/bootstrap.go
+++ b/pkg/model/bootstrap.go
@@ -36,6 +36,7 @@ type Bootstrap struct {
        Config           *ConfigCenter     `yaml:"config-center" 
json:"config-center" mapstructure:"config-center"`
        // Third party dependency
        Nacos *Nacos `yaml:"nacos" json:"nacos" mapstructure:"nacos"`
+       Log   *Log   `yaml:"log" json:"log" mapstructure:"log"`
 }
 
 // Node node info for dynamic identifier
diff --git a/pkg/model/log.go b/pkg/model/log.go
new file mode 100644
index 00000000..770c07a0
--- /dev/null
+++ b/pkg/model/log.go
@@ -0,0 +1,169 @@
+/*
+ * 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 model
+
+import (
+       "github.com/apache/dubbo-go-pixiu/pkg/logger"
+       "go.uber.org/zap"
+       "go.uber.org/zap/zapcore"
+)
+
+type Log struct {
+       Level             string                 `json:"level" yaml:"level"`
+       Development       bool                   `json:"development" 
yaml:"development"`
+       DisableCaller     bool                   `json:"disableCaller" 
yaml:"disableCaller"`
+       DisableStacktrace bool                   `json:"disableStacktrace" 
yaml:"disableStacktrace"`
+       Sampling          SamplingConfig         `json:"sampling" 
yaml:"sampling"`
+       Encoding          string                 `json:"encoding" 
yaml:"encoding"`
+       EncoderConfig     EncoderConfig          `json:"encoderConfig" 
yaml:"encoderConfig"`
+       OutputPaths       []string               `json:"outputPaths" 
yaml:"outputPaths"`
+       ErrorOutputPaths  []string               `json:"errorOutputPaths" 
yaml:"errorOutputPaths"`
+       InitialFields     map[string]interface{} `json:"initialFields" 
yaml:"initialFields"`
+}
+
+func (l *Log) Build() *zap.Config {
+       lvl, err := zap.ParseAtomicLevel(l.Level)
+       if err != nil {
+               logger.Errorf("failed parse %s to zap.AtomicLevel", l.Level)
+       }
+
+       return &zap.Config{
+               Level:             lvl,
+               Development:       l.Development,
+               DisableCaller:     l.DisableCaller,
+               DisableStacktrace: l.DisableStacktrace,
+               Sampling:          l.Sampling.build(),
+               Encoding:          l.Encoding,
+               EncoderConfig:     l.EncoderConfig.build(),
+               OutputPaths:       l.OutputPaths,
+               ErrorOutputPaths:  l.ErrorOutputPaths,
+               InitialFields:     l.InitialFields,
+       }
+}
+
+type SamplingConfig struct {
+       Initial    int                                           
`json:"initial" yaml:"initial"`
+       Thereafter int                                           
`json:"thereafter" yaml:"thereafter"`
+       Hook       func(zapcore.Entry, zapcore.SamplingDecision) `json:"-" 
yaml:"-"`
+}
+
+func (s *SamplingConfig) build() *zap.SamplingConfig {
+       return &zap.SamplingConfig{
+               Initial:    s.Initial,
+               Thereafter: s.Thereafter,
+       }
+}
+
+type EncoderConfig struct {
+       MessageKey       string `json:"messageKey" yaml:"messageKey"`
+       LevelKey         string `json:"levelKey" yaml:"levelKey"`
+       TimeKey          string `json:"timeKey" yaml:"timeKey"`
+       NameKey          string `json:"nameKey" yaml:"nameKey"`
+       CallerKey        string `json:"callerKey" yaml:"callerKey"`
+       FunctionKey      string `json:"functionKey" yaml:"functionKey"`
+       StacktraceKey    string `json:"stacktraceKey" yaml:"stacktraceKey"`
+       SkipLineEnding   bool   `json:"skipLineEnding" yaml:"skipLineEnding"`
+       LineEnding       string `json:"lineEnding" yaml:"lineEnding"`
+       EncodeLevel      string `json:"levelEncoder" yaml:"levelEncoder"`
+       EncodeTime       string `json:"timeEncoder" yaml:"timeEncoder"`
+       EncodeDuration   string `json:"durationEncoder" yaml:"durationEncoder"`
+       EncodeCaller     string `json:"callerEncoder" yaml:"callerEncoder"`
+       EncodeName       string `json:"nameEncoder" yaml:"nameEncoder"`
+       ConsoleSeparator string `json:"consoleSeparator" 
yaml:"consoleSeparator"`
+}
+
+func (e *EncoderConfig) build() zapcore.EncoderConfig {
+       return zapcore.EncoderConfig{
+               MessageKey:       e.MessageKey,
+               LevelKey:         e.LevelKey,
+               TimeKey:          e.TimeKey,
+               NameKey:          e.NameKey,
+               CallerKey:        e.CallerKey,
+               FunctionKey:      e.FunctionKey,
+               StacktraceKey:    e.StacktraceKey,
+               SkipLineEnding:   e.SkipLineEnding,
+               LineEnding:       e.LineEnding,
+               EncodeLevel:      e.unmarshalLevelEncoder(),
+               EncodeTime:       e.unmarshalTimeEncoder(),
+               EncodeDuration:   e.unmarshalDurationEncoder(),
+               EncodeCaller:     e.unmarshalCallerEncoder(),
+               EncodeName:       e.unmarshalNameEncoder(),
+               ConsoleSeparator: e.ConsoleSeparator,
+       }
+}
+
+func (e *EncoderConfig) unmarshalLevelEncoder() zapcore.LevelEncoder {
+       switch e.EncodeLevel {
+       case "capital":
+               return zapcore.CapitalLevelEncoder
+       case "capitalColor":
+               return zapcore.CapitalColorLevelEncoder
+       case "color":
+               return zapcore.LowercaseColorLevelEncoder
+       default:
+               return zapcore.LowercaseLevelEncoder
+       }
+}
+
+func (e *EncoderConfig) unmarshalTimeEncoder() zapcore.TimeEncoder {
+       switch e.EncodeTime {
+       case "rfc3339nano", "RFC3339Nano":
+               return zapcore.RFC3339NanoTimeEncoder
+       case "rfc3339", "RFC3339":
+               return zapcore.RFC3339TimeEncoder
+       case "iso8601", "ISO8601":
+               return zapcore.ISO8601TimeEncoder
+       case "millis":
+               return zapcore.EpochMillisTimeEncoder
+       case "nanos":
+               return zapcore.EpochNanosTimeEncoder
+       default:
+               return zapcore.EpochTimeEncoder
+       }
+}
+
+func (e *EncoderConfig) unmarshalDurationEncoder() zapcore.DurationEncoder {
+       switch e.EncodeDuration {
+       case "string":
+               return zapcore.StringDurationEncoder
+       case "nanos":
+               return zapcore.NanosDurationEncoder
+       case "ms":
+               return zapcore.MillisDurationEncoder
+       default:
+               return zapcore.SecondsDurationEncoder
+       }
+}
+
+func (e *EncoderConfig) unmarshalCallerEncoder() zapcore.CallerEncoder {
+       switch e.EncodeCaller {
+       case "full":
+               return zapcore.FullCallerEncoder
+       default:
+               return zapcore.ShortCallerEncoder
+       }
+}
+
+func (e *EncoderConfig) unmarshalNameEncoder() zapcore.NameEncoder {
+       switch e.EncodeName {
+       case "full":
+               return zapcore.FullNameEncoder
+       default:
+               return zapcore.FullNameEncoder
+       }
+}

Reply via email to