diff --git a/cmd/layotto/cmd.go b/cmd/layotto/cmd.go index acd1ec0f6f..1b398acd99 100644 --- a/cmd/layotto/cmd.go +++ b/cmd/layotto/cmd.go @@ -28,6 +28,8 @@ import ( mosn_zipkin "mosn.io/mosn/pkg/trace/zipkin" "mosn.io/pkg/buffer" + "mosn.io/layotto/kit/logger" + component_actuators "mosn.io/layotto/components/pkg/actuators" "mosn.io/layotto/diagnostics" "mosn.io/layotto/diagnostics/jaeger" @@ -113,6 +115,14 @@ var ( }, cli.StringSliceFlag{ Name: "component-log-level, lc", Usage: "mosn component format, currently useless", + }, cli.StringFlag{ + Name: "logging-level, ll", + Usage: "layotto log level, trace|debug|info|warn|error|fatal", + EnvVar: "LOGGING_LEVEL", + }, cli.StringFlag{ + Name: "logging-path, lp", + Usage: "layotto log file path, default ./", + EnvVar: "LOGGING_PATH", }, cli.StringFlag{ Name: "local-address-ip-version", Usage: "ip version, v4 or v6, currently useless", @@ -247,6 +257,13 @@ func SetActuatorAfterStart(_ stagemanager.Application) { } func DefaultParamsParsed(c *cli.Context) { + // log level control + flagLoggingLevel := c.String("logging-level") + logger.SetDefaultLoggerLevel(flagLoggingLevel) + + flagLoggingPath := c.String("logging-path") + logger.SetDefaultLoggerFilePath(flagLoggingPath) + // log level control flagLogLevel := c.String("log-level") if mosnLogLevel, ok := flagToMosnLogLevel[flagLogLevel]; ok { @@ -295,8 +312,9 @@ func ExtensionsRegister(_ *cli.Context) { trace.RegisterTracerBuilder(mosn_jaeger.DriverName, lprotocol.Layotto, jaeger.NewGrpcJaegerTracer) trace.RegisterTracerBuilder(mosn_zipkin.DriverName, lprotocol.Layotto, zipkin.NewGrpcZipTracer) + log := logger.NewLayottoLogger("iobuffer") // register buffer logger buffer.SetLogFunc(func(msg string) { - log.DefaultLogger.Errorf("[iobuffer] iobuffer error log info: %s", msg) + log.Errorf("[iobuffer] iobuffer error log info: %s", msg) }) } diff --git a/cmd/layotto/main.go b/cmd/layotto/main.go index bbce00a267..6bd1259e9b 100644 --- a/cmd/layotto/main.go +++ b/cmd/layotto/main.go @@ -73,7 +73,6 @@ import ( dbindings "github.com/dapr/components-contrib/bindings" "github.com/dapr/components-contrib/bindings/http" - "mosn.io/pkg/log" "mosn.io/layotto/components/configstores/etcdv3" "mosn.io/layotto/components/configstores/nacos" @@ -161,6 +160,7 @@ import ( _ "mosn.io/layotto/pkg/actuator" "mosn.io/layotto/pkg/actuator/health" actuatorInfo "mosn.io/layotto/pkg/actuator/info" + actuatorLogger "mosn.io/layotto/pkg/actuator/logger" _ "mosn.io/layotto/pkg/filter/stream/actuator/http" "mosn.io/layotto/pkg/integrate/actuator" @@ -178,6 +178,8 @@ import ( _ "mosn.io/mosn/pkg/wasm/runtime/wasmer" _ "mosn.io/pkg/buffer" + layottoLogger "mosn.io/layotto/kit/logger" + _ "mosn.io/layotto/pkg/filter/network/tcpcopy" _ "mosn.io/layotto/pkg/filter/stream/wasm/http" l8_grpc "mosn.io/layotto/pkg/grpc" @@ -234,6 +236,9 @@ import ( // loggerForDaprComp is constructed for reusing dapr's components. var loggerForDaprComp = logger.NewLogger("reuse.dapr.component") +// loggerForLayotto is constructed for layotto. +var loggerForLayotto = layottoLogger.NewLayottoLogger("layotto") + // GitVersion mosn version is specified by latest tag var GitVersion = "" var IstioVersion = "1.10.6" @@ -242,6 +247,7 @@ func init() { mgrpc.RegisterServerHandler("runtime", NewRuntimeGrpcServer) // Register default actuator implementations actuatorInfo.AddInfoContributor("app", actuator.GetAppContributor()) + actuatorLogger.NewEndpoint() health.AddReadinessIndicator("runtime_startup", actuator.GetRuntimeReadinessIndicator()) health.AddLivenessIndicator("runtime_startup", actuator.GetRuntimeLivenessIndicator()) } @@ -253,7 +259,7 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp // fail fast if error occurs during startup. // The reason we panic in a new goroutine is to prevent mosn from recovering. go func() { - log.DefaultLogger.Errorf("An error occurred during startup : %v", err) + loggerForLayotto.Errorf("An error occurred during startup : %v", err) panic(err) }() } @@ -432,22 +438,22 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp // Lock runtime.WithLockFactory( runtime_lock.NewFactory("redis_cluster", func() lock.LockStore { - return lock_redis.NewClusterRedisLock(log.DefaultLogger) + return lock_redis.NewClusterRedisLock() }), runtime_lock.NewFactory("redis", func() lock.LockStore { - return lock_redis.NewStandaloneRedisLock(log.DefaultLogger) + return lock_redis.NewStandaloneRedisLock() }), runtime_lock.NewFactory("zookeeper", func() lock.LockStore { - return lock_zookeeper.NewZookeeperLock(log.DefaultLogger) + return lock_zookeeper.NewZookeeperLock() }), runtime_lock.NewFactory("etcd", func() lock.LockStore { - return lock_etcd.NewEtcdLock(log.DefaultLogger) + return lock_etcd.NewEtcdLock() }), runtime_lock.NewFactory("consul", func() lock.LockStore { - return lock_consul.NewConsulLock(log.DefaultLogger) + return lock_consul.NewConsulLock() }), runtime_lock.NewFactory("mongo", func() lock.LockStore { - return lock_mongo.NewMongoLock(log.DefaultLogger) + return lock_mongo.NewMongoLock() }), runtime_lock.NewFactory("in-memory", func() lock.LockStore { return lock_inmemory.NewInMemoryLock() @@ -464,25 +470,25 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp // Sequencer runtime.WithSequencerFactory( runtime_sequencer.NewFactory("etcd", func() sequencer.Store { - return sequencer_etcd.NewEtcdSequencer(log.DefaultLogger) + return sequencer_etcd.NewEtcdSequencer() }), runtime_sequencer.NewFactory("redis", func() sequencer.Store { - return sequencer_redis.NewStandaloneRedisSequencer(log.DefaultLogger) + return sequencer_redis.NewStandaloneRedisSequencer() }), runtime_sequencer.NewFactory("zookeeper", func() sequencer.Store { - return sequencer_zookeeper.NewZookeeperSequencer(log.DefaultLogger) + return sequencer_zookeeper.NewZookeeperSequencer() }), runtime_sequencer.NewFactory("mongo", func() sequencer.Store { - return sequencer_mongo.NewMongoSequencer(log.DefaultLogger) + return sequencer_mongo.NewMongoSequencer() }), runtime_sequencer.NewFactory("in-memory", func() sequencer.Store { return sequencer_inmemory.NewInMemorySequencer() }), runtime_sequencer.NewFactory("mysql", func() sequencer.Store { - return sequencer_mysql.NewMySQLSequencer(log.DefaultLogger) + return sequencer_mysql.NewMySQLSequencer() }), runtime_sequencer.NewFactory("snowflake", func() sequencer.Store { - return sequencer_snowflake.NewSnowFlakeSequencer(log.DefaultLogger) + return sequencer_snowflake.NewSnowFlakeSequencer() }), ), // secretstores diff --git a/cmd/layotto_multiple_api/cmd.go b/cmd/layotto_multiple_api/cmd.go index acd1ec0f6f..5c804ef6c9 100644 --- a/cmd/layotto_multiple_api/cmd.go +++ b/cmd/layotto_multiple_api/cmd.go @@ -5,6 +5,8 @@ import ( "runtime" "time" + "mosn.io/layotto/kit/logger" + "mosn.io/api" "mosn.io/mosn/istio/istio1106" v2 "mosn.io/mosn/pkg/config/v2" @@ -295,8 +297,9 @@ func ExtensionsRegister(_ *cli.Context) { trace.RegisterTracerBuilder(mosn_jaeger.DriverName, lprotocol.Layotto, jaeger.NewGrpcJaegerTracer) trace.RegisterTracerBuilder(mosn_zipkin.DriverName, lprotocol.Layotto, zipkin.NewGrpcZipTracer) + log := logger.NewLayottoLogger("iobuffer") // register buffer logger buffer.SetLogFunc(func(msg string) { - log.DefaultLogger.Errorf("[iobuffer] iobuffer error log info: %s", msg) + log.Errorf("[iobuffer] iobuffer error log info: %s", msg) }) } diff --git a/cmd/layotto_multiple_api/main.go b/cmd/layotto_multiple_api/main.go index dd872f7c20..3effb91f6e 100644 --- a/cmd/layotto_multiple_api/main.go +++ b/cmd/layotto_multiple_api/main.go @@ -23,6 +23,9 @@ import ( "strconv" "time" + layottoLogger "mosn.io/layotto/kit/logger" + actuatorLogger "mosn.io/layotto/pkg/actuator/logger" + "mosn.io/layotto/components/sms" "mosn.io/layotto/components/cryption" @@ -70,7 +73,6 @@ import ( dbindings "github.com/dapr/components-contrib/bindings" "github.com/dapr/components-contrib/bindings/http" - "mosn.io/pkg/log" "mosn.io/layotto/cmd/layotto_multiple_api/helloworld/component" "mosn.io/layotto/components/configstores/etcdv3" @@ -231,6 +233,9 @@ import ( // loggerForDaprComp is constructed for reusing dapr's components. var loggerForDaprComp = logger.NewLogger("reuse.dapr.component") +// loggerForLayotto is constructed for layotto. +var loggerForLayotto = layottoLogger.NewLayottoLogger("layotto") + // GitVersion mosn version is specified by latest tag var GitVersion = "" var IstioVersion = "1.10.6" @@ -239,6 +244,7 @@ func init() { mgrpc.RegisterServerHandler("runtime", NewRuntimeGrpcServer) // Register default actuator implementations actuatorInfo.AddInfoContributor("app", actuator.GetAppContributor()) + actuatorLogger.NewEndpoint() health.AddReadinessIndicator("runtime_startup", actuator.GetRuntimeReadinessIndicator()) health.AddLivenessIndicator("runtime_startup", actuator.GetRuntimeLivenessIndicator()) } @@ -250,7 +256,7 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp // fail fast if error occurs during startup. // The reason we panic in a new goroutine is to prevent mosn from recovering. go func() { - log.DefaultLogger.Errorf("An error occurred during startup : %v", err) + loggerForLayotto.Errorf("An error occurred during startup : %v", err) panic(err) }() } @@ -436,22 +442,22 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp // Lock runtime.WithLockFactory( runtime_lock.NewFactory("redis_cluster", func() lock.LockStore { - return lock_redis.NewClusterRedisLock(log.DefaultLogger) + return lock_redis.NewClusterRedisLock() }), runtime_lock.NewFactory("redis", func() lock.LockStore { - return lock_redis.NewStandaloneRedisLock(log.DefaultLogger) + return lock_redis.NewStandaloneRedisLock() }), runtime_lock.NewFactory("zookeeper", func() lock.LockStore { - return lock_zookeeper.NewZookeeperLock(log.DefaultLogger) + return lock_zookeeper.NewZookeeperLock() }), runtime_lock.NewFactory("etcd", func() lock.LockStore { - return lock_etcd.NewEtcdLock(log.DefaultLogger) + return lock_etcd.NewEtcdLock() }), runtime_lock.NewFactory("consul", func() lock.LockStore { - return lock_consul.NewConsulLock(log.DefaultLogger) + return lock_consul.NewConsulLock() }), runtime_lock.NewFactory("mongo", func() lock.LockStore { - return lock_mongo.NewMongoLock(log.DefaultLogger) + return lock_mongo.NewMongoLock() }), runtime_lock.NewFactory("in-memory", func() lock.LockStore { return lock_inmemory.NewInMemoryLock() @@ -468,25 +474,25 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp // Sequencer runtime.WithSequencerFactory( runtime_sequencer.NewFactory("etcd", func() sequencer.Store { - return sequencer_etcd.NewEtcdSequencer(log.DefaultLogger) + return sequencer_etcd.NewEtcdSequencer() }), runtime_sequencer.NewFactory("redis", func() sequencer.Store { - return sequencer_redis.NewStandaloneRedisSequencer(log.DefaultLogger) + return sequencer_redis.NewStandaloneRedisSequencer() }), runtime_sequencer.NewFactory("zookeeper", func() sequencer.Store { - return sequencer_zookeeper.NewZookeeperSequencer(log.DefaultLogger) + return sequencer_zookeeper.NewZookeeperSequencer() }), runtime_sequencer.NewFactory("mongo", func() sequencer.Store { - return sequencer_mongo.NewMongoSequencer(log.DefaultLogger) + return sequencer_mongo.NewMongoSequencer() }), runtime_sequencer.NewFactory("in-memory", func() sequencer.Store { return sequencer_inmemory.NewInMemorySequencer() }), runtime_sequencer.NewFactory("mysql", func() sequencer.Store { - return sequencer_mysql.NewMySQLSequencer(log.DefaultLogger) + return sequencer_mysql.NewMySQLSequencer() }), runtime_sequencer.NewFactory("snowflake", func() sequencer.Store { - return sequencer_snowflake.NewSnowFlakeSequencer(log.DefaultLogger) + return sequencer_snowflake.NewSnowFlakeSequencer() }), ), // secretstores diff --git a/cmd/layotto_without_xds/cmd.go b/cmd/layotto_without_xds/cmd.go index 62efb43aa6..70e2819d9c 100644 --- a/cmd/layotto_without_xds/cmd.go +++ b/cmd/layotto_without_xds/cmd.go @@ -4,6 +4,8 @@ import ( "os" "runtime" + "mosn.io/layotto/kit/logger" + "mosn.io/api" v2 "mosn.io/mosn/pkg/config/v2" "mosn.io/mosn/pkg/configmanager" @@ -68,6 +70,14 @@ var ( Name: "log-level, l", Usage: "mosn log level, trace|debug|info|warning|error|critical|off", EnvVar: "LOG_LEVEL", + }, cli.StringFlag{ + Name: "logging-level, ll", + Usage: "layotto log level, trace|debug|info|warn|error|fatal", + EnvVar: "LOGGING_LEVEL", + }, cli.StringFlag{ + Name: "logging-path, lp", + Usage: "layotto log file path, default ./", + EnvVar: "LOGGING_PATH", }, }, Action: func(c *cli.Context) error { @@ -144,6 +154,13 @@ func SetActuatorAfterStart(_ stagemanager.Application) { } func DefaultParamsParsed(c *cli.Context) { + // log level control + flagLoggingLevel := c.String("logging-level") + logger.SetDefaultLoggerLevel(flagLoggingLevel) + + flagLoggingPath := c.String("logging-path") + logger.SetDefaultLoggerFilePath(flagLoggingPath) + // log level control flagLogLevel := c.String("log-level") if mosnLogLevel, ok := flagToMosnLogLevel[flagLogLevel]; ok { @@ -192,8 +209,9 @@ func ExtensionsRegister(_ *cli.Context) { trace.RegisterTracerBuilder(mosn_jaeger.DriverName, lprotocol.Layotto, jaeger.NewGrpcJaegerTracer) trace.RegisterTracerBuilder(mosn_zipkin.DriverName, lprotocol.Layotto, zipkin.NewGrpcZipTracer) + log := logger.NewLayottoLogger("iobuffer") // register buffer logger buffer.SetLogFunc(func(msg string) { - log.DefaultLogger.Errorf("[iobuffer] iobuffer error log info: %s", msg) + log.Errorf("[iobuffer] iobuffer error log info: %s", msg) }) } diff --git a/cmd/layotto_without_xds/main.go b/cmd/layotto_without_xds/main.go index 01f5c89ffc..de791a541f 100644 --- a/cmd/layotto_without_xds/main.go +++ b/cmd/layotto_without_xds/main.go @@ -23,6 +23,9 @@ import ( "strconv" "time" + layottoLogger "mosn.io/layotto/kit/logger" + actuatorLogger "mosn.io/layotto/pkg/actuator/logger" + "mosn.io/layotto/components/sms" "mosn.io/layotto/components/cryption" @@ -67,7 +70,6 @@ import ( dbindings "github.com/dapr/components-contrib/bindings" "github.com/dapr/components-contrib/bindings/http" - "mosn.io/pkg/log" "mosn.io/layotto/components/configstores/etcdv3" "mosn.io/layotto/components/configstores/nacos" @@ -214,6 +216,9 @@ import ( // loggerForDaprComp is constructed for reusing dapr's components. var loggerForDaprComp = logger.NewLogger("reuse.dapr.component") +// loggerForLayotto is constructed for layotto. +var loggerForLayotto = layottoLogger.NewLayottoLogger("layotto") + // GitVersion mosn version is specified by latest tag var GitVersion = "" @@ -221,6 +226,7 @@ func init() { mgrpc.RegisterServerHandler("runtime", NewRuntimeGrpcServer) // Register default actuator implementations actuatorInfo.AddInfoContributor("app", actuator.GetAppContributor()) + actuatorLogger.NewEndpoint() health.AddReadinessIndicator("runtime_startup", actuator.GetRuntimeReadinessIndicator()) health.AddLivenessIndicator("runtime_startup", actuator.GetRuntimeLivenessIndicator()) } @@ -232,7 +238,7 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp // fail fast if error occurs during startup. // The reason we panic in a new goroutine is to prevent mosn from recovering. go func() { - log.DefaultLogger.Errorf("An error occurred during startup : %v", err) + loggerForLayotto.Errorf("An error occurred during startup : %v", err) panic(err) }() } @@ -392,22 +398,22 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp // Lock runtime.WithLockFactory( runtime_lock.NewFactory("redis_cluster", func() lock.LockStore { - return lock_redis.NewClusterRedisLock(log.DefaultLogger) + return lock_redis.NewClusterRedisLock() }), runtime_lock.NewFactory("redis", func() lock.LockStore { - return lock_redis.NewStandaloneRedisLock(log.DefaultLogger) + return lock_redis.NewStandaloneRedisLock() }), runtime_lock.NewFactory("zookeeper", func() lock.LockStore { - return lock_zookeeper.NewZookeeperLock(log.DefaultLogger) + return lock_zookeeper.NewZookeeperLock() }), runtime_lock.NewFactory("etcd", func() lock.LockStore { - return lock_etcd.NewEtcdLock(log.DefaultLogger) + return lock_etcd.NewEtcdLock() }), runtime_lock.NewFactory("consul", func() lock.LockStore { - return lock_consul.NewConsulLock(log.DefaultLogger) + return lock_consul.NewConsulLock() }), runtime_lock.NewFactory("mongo", func() lock.LockStore { - return lock_mongo.NewMongoLock(log.DefaultLogger) + return lock_mongo.NewMongoLock() }), runtime_lock.NewFactory("in-memory", func() lock.LockStore { return lock_inmemory.NewInMemoryLock() @@ -440,22 +446,22 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp // Sequencer runtime.WithSequencerFactory( runtime_sequencer.NewFactory("etcd", func() sequencer.Store { - return sequencer_etcd.NewEtcdSequencer(log.DefaultLogger) + return sequencer_etcd.NewEtcdSequencer() }), runtime_sequencer.NewFactory("redis", func() sequencer.Store { - return sequencer_redis.NewStandaloneRedisSequencer(log.DefaultLogger) + return sequencer_redis.NewStandaloneRedisSequencer() }), runtime_sequencer.NewFactory("zookeeper", func() sequencer.Store { - return sequencer_zookeeper.NewZookeeperSequencer(log.DefaultLogger) + return sequencer_zookeeper.NewZookeeperSequencer() }), runtime_sequencer.NewFactory("mongo", func() sequencer.Store { - return sequencer_mongo.NewMongoSequencer(log.DefaultLogger) + return sequencer_mongo.NewMongoSequencer() }), runtime_sequencer.NewFactory("in-memory", func() sequencer.Store { return sequencer_inmemory.NewInMemorySequencer() }), runtime_sequencer.NewFactory("snowflake", func() sequencer.Store { - return sequencer_snowflake.NewSnowFlakeSequencer(log.DefaultLogger) + return sequencer_snowflake.NewSnowFlakeSequencer() }), ), // secretstores diff --git a/components/configstores/apollo/change_listener.go b/components/configstores/apollo/change_listener.go index 4240bc4257..6f16dc5a95 100644 --- a/components/configstores/apollo/change_listener.go +++ b/components/configstores/apollo/change_listener.go @@ -20,7 +20,8 @@ import ( "time" "github.com/apolloconfig/agollo/v4/storage" - "mosn.io/pkg/log" + + "mosn.io/layotto/kit/logger" "mosn.io/layotto/components/configstores" ) @@ -29,6 +30,7 @@ type changeListener struct { subscribers *subscriberHolder timeout time.Duration store RepoForListener + logger logger.Logger } type RepoForListener interface { @@ -38,11 +40,12 @@ type RepoForListener interface { GetStoreName() string } -func newChangeListener(c RepoForListener) *changeListener { +func newChangeListener(c RepoForListener, log logger.Logger) *changeListener { return &changeListener{ subscribers: newSubscriberHolder(), timeout: time.Duration(defaultTimeoutWhenResponse) * time.Millisecond, store: c, + logger: log, } } @@ -72,7 +75,7 @@ func (lis *changeListener) notify(s *subscriber, keyWithLabel string, change *st // 1 recover panic caused when interacting with the chan defer func() { if r := recover(); r != nil { - log.DefaultLogger.Errorf("panic when notify subscriber. %v", r) + lis.logger.Errorf("panic when notify subscriber. %v", r) // make sure unused chan are all deleted if lis != nil && lis.subscribers != nil { lis.subscribers.remove(s) @@ -90,7 +93,7 @@ func (lis *changeListener) notify(s *subscriber, keyWithLabel string, change *st tags, err := lis.store.getAllTags(s.group, keyWithLabel) if err != nil { // log and ignore - log.DefaultLogger.Errorf("Error when querying tags in change_listener: %v", err) + lis.logger.Errorf("Error when querying tags in change_listener: %v", err) } else { item.Tags = tags } diff --git a/components/configstores/apollo/change_listener_test.go b/components/configstores/apollo/change_listener_test.go index 58b40a8143..b434e6348f 100644 --- a/components/configstores/apollo/change_listener_test.go +++ b/components/configstores/apollo/change_listener_test.go @@ -58,7 +58,7 @@ func setupChangeListener() *changeListener { mockRepo := &MockRepo{ c: NewStore().(*ConfigStore), } - return newChangeListener(mockRepo) + return newChangeListener(mockRepo, mockRepo.c.log) } // Test modified diff --git a/components/configstores/apollo/configstore.go b/components/configstores/apollo/configstore.go index 263fda0c2c..8ed5c5c022 100644 --- a/components/configstores/apollo/configstore.go +++ b/components/configstores/apollo/configstore.go @@ -29,9 +29,9 @@ import ( "mosn.io/layotto/components/pkg/actuators" - "mosn.io/pkg/log" - "mosn.io/layotto/components/configstores" + + log "mosn.io/layotto/kit/logger" ) var ( @@ -64,6 +64,7 @@ type ConfigStore struct { kvConfig *repoConfig tagsConfig *repoConfig openAPIClient httpClient + log log.Logger } type httpClient interface { Do(req *http.Request) (*http.Response, error) @@ -87,14 +88,21 @@ func (c *ConfigStore) GetDefaultLabel() string { func NewStore() configstores.Store { registerActuator() - return &ConfigStore{ + cs := &ConfigStore{ tagsNamespace: defaultTagsNamespace, delimiter: defaultDelimiter, env: defaultEnv, kvRepo: newAgolloRepository(), tagsRepo: newAgolloRepository(), openAPIClient: newHttpClient(), + log: log.NewLayottoLogger("configstore/apollo"), } + log.RegisterComponentLoggerListener("configstore/apollo", cs) + return cs +} + +func (c *ConfigStore) OnLogLevelChanged(outputLevel log.LogLevel) { + c.log.SetLogLevel(outputLevel) } func registerActuator() { @@ -180,6 +188,7 @@ func (c *ConfigStore) doInit(config *configstores.StoreConfig) error { isBackupConfig: isBackupConfig, // secret,not required secret: metadata["secret"], + logger: c.log, } c.kvConfig = kvRepoConfig c.kvRepo.SetConfig(kvRepoConfig) @@ -197,7 +206,7 @@ func (c *ConfigStore) doInit(config *configstores.StoreConfig) error { return err } // 4. SetConfig listener - listener := newChangeListener(c) + listener := newChangeListener(c, c.log) c.listener = listener c.kvRepo.AddChangeListener(listener) return nil @@ -381,7 +390,7 @@ func (c *ConfigStore) StopSubscribe() { } func (c *ConfigStore) getKeys(group string, keys []string, label string) ([]*configstores.ConfigurationItem, error) { - log.DefaultLogger.Debugf("getKeys start.namespace : %v, keys : %v, label : %v", group, keys, label) + c.log.Debugf("getKeys start.namespace : %v, keys : %v, label : %v", group, keys, label) // 1. prepare suffix suffix := "" if label != "" { @@ -395,7 +404,7 @@ func (c *ConfigStore) getKeys(group string, keys []string, label string) ([]*con value, err := c.kvRepo.Get(group, keyWithLabel) if err != nil { //log error and ignore this key - log.DefaultLogger.Errorf("error when querying configuration :%v", err) + c.log.Errorf("error when querying configuration :%v", err) continue } item := &configstores.ConfigurationItem{} @@ -406,7 +415,7 @@ func (c *ConfigStore) getKeys(group string, keys []string, label string) ([]*con // query tags item.Tags, err = c.getAllTags(group, keyWithLabel) if err != nil { - log.DefaultLogger.Errorf("error when querying tags :%v", err) + c.log.Errorf("error when querying tags :%v", err) } res = append(res, item) } @@ -415,7 +424,7 @@ func (c *ConfigStore) getKeys(group string, keys []string, label string) ([]*con } func (c *ConfigStore) getAllWithAppId() ([]*configstores.ConfigurationItem, error) { - log.DefaultLogger.Debugf("getAllWithAppId start.namespace:%v", c.kvConfig.namespaceName) + c.log.Debugf("getAllWithAppId start.namespace:%v", c.kvConfig.namespaceName) split := strings.Split(c.kvConfig.namespaceName, ",") res := make([]*configstores.ConfigurationItem, 0, 10) // loop every namespace in config @@ -430,7 +439,7 @@ func (c *ConfigStore) getAllWithAppId() ([]*configstores.ConfigurationItem, erro } func (c *ConfigStore) getAllWithNamespace(group string) ([]*configstores.ConfigurationItem, error) { - log.DefaultLogger.Debugf("getAllWithNamespace start.namespace:%v", group) + c.log.Debugf("getAllWithNamespace start.namespace:%v", group) res := make([]*configstores.ConfigurationItem, 0, 10) // 1. loop query err := c.kvRepo.Range(group, func(key, value interface{}) bool { @@ -440,7 +449,7 @@ func (c *ConfigStore) getAllWithNamespace(group string) ([]*configstores.Configu k := key.(string) if k == "" { // never happen - log.DefaultLogger.Errorf("find configuration item with blank key under namespace:%v", group) + c.log.Errorf("find configuration item with blank key under namespace:%v", group) } else { split := strings.Split(k, defaultDelimiter) item.Key = split[0] @@ -450,7 +459,7 @@ func (c *ConfigStore) getAllWithNamespace(group string) ([]*configstores.Configu // 1.2. query tags tags, err := c.getAllTags(group, k) if err != nil { - log.DefaultLogger.Errorf("error when querying tags :%v", err) + c.log.Errorf("error when querying tags :%v", err) } else { item.Tags = tags } @@ -624,7 +633,7 @@ func (c *ConfigStore) createNamespace(env string, appId string, cluster string, } // add headers c.addHeaderForOpenAPI(req) - log.DefaultLogger.Debugf("createNamespace url: %v, request body: %s, request: %+v", url, reqBodyJson, req) + c.log.Debugf("createNamespace url: %v, request body: %s, request: %+v", url, reqBodyJson, req) // do request resp, err := c.openAPIClient.Do(req) // 2. parse @@ -639,20 +648,20 @@ func (c *ConfigStore) createNamespace(env string, appId string, cluster string, // if the namespace already exists, the status code will be 400 if resp.StatusCode == http.StatusBadRequest { // log debug information - if log.DefaultLogger.GetLogLevel() >= log.DEBUG { + if log.ToLogPriority(c.log.GetLogLevel()) <= log.ToLogPriority(log.DebugLevel) { b, err := ioutil.ReadAll(resp.Body) if err != nil { - log.DefaultLogger.Errorf("An error occurred when parsing createNamespace response. statusCode: %v ,error: %v", resp.StatusCode, err) + c.log.Errorf("An error occurred when parsing createNamespace response. statusCode: %v ,error: %v", resp.StatusCode, err) return err } - log.DefaultLogger.Debugf("createNamespace not ok. StatusCode: %v, response body: %s", resp.StatusCode, b) + c.log.Debugf("createNamespace not ok. StatusCode: %v, response body: %s", resp.StatusCode, b) } return nil } // Fail fast and take it as an startup error if the status code is neither 200 nor 400 b, err := ioutil.ReadAll(resp.Body) if err != nil { - log.DefaultLogger.Errorf("An error occurred when parsing createNamespace response. statusCode: %v ,error: %v", resp.StatusCode, err) + c.log.Errorf("An error occurred when parsing createNamespace response. statusCode: %v ,error: %v", resp.StatusCode, err) return err } return fmt.Errorf("createNamespace error. StatusCode: %v, response body: %s", resp.StatusCode, b) diff --git a/components/configstores/apollo/configstore_test.go b/components/configstores/apollo/configstore_test.go index 2271d0b8bb..19d711b812 100644 --- a/components/configstores/apollo/configstore_test.go +++ b/components/configstores/apollo/configstore_test.go @@ -27,7 +27,6 @@ import ( "testing" "github.com/stretchr/testify/assert" - "mosn.io/mosn/pkg/log" "mosn.io/layotto/components/configstores" ) @@ -207,7 +206,6 @@ func TestConfigStore_Init(t *testing.T) { // 2. test the ConfigStore,which has a MockRepository in it // init - log.DefaultLogger.SetLogLevel(log.DEBUG) err := store.Init(cfg) assert.NotNil(t, err) }) @@ -224,7 +222,6 @@ func TestConfigStore_Init(t *testing.T) { // 2. test the ConfigStore,which has a MockRepository in it // init - log.DefaultLogger.SetLogLevel(log.DEBUG) err := store.Init(cfg) assert.Error(t, err) }) @@ -241,7 +238,6 @@ func TestConfigStore_Init(t *testing.T) { // 2. test the ConfigStore,which has a MockRepository in it // init - log.DefaultLogger.SetLogLevel(log.DEBUG) err := store.Init(cfg) assert.Nil(t, err) }) diff --git a/components/configstores/apollo/default_logger.go b/components/configstores/apollo/default_logger.go index 99204ae296..a64da50e6a 100644 --- a/components/configstores/apollo/default_logger.go +++ b/components/configstores/apollo/default_logger.go @@ -17,15 +17,15 @@ package apollo import ( - "mosn.io/pkg/log" + "mosn.io/layotto/kit/logger" ) // An adapter to implement log.LoggerInterface in agollo package. type DefaultLogger struct { - logger log.ErrorLogger + logger logger.Logger } -func NewDefaultLogger(logger log.ErrorLogger) *DefaultLogger { +func NewDefaultLogger(logger logger.Logger) *DefaultLogger { return &DefaultLogger{ logger: logger, } diff --git a/components/configstores/apollo/default_logger_test.go b/components/configstores/apollo/default_logger_test.go index 0e954f4908..4375122ae6 100644 --- a/components/configstores/apollo/default_logger_test.go +++ b/components/configstores/apollo/default_logger_test.go @@ -19,20 +19,13 @@ package apollo import ( "testing" - "github.com/stretchr/testify/assert" - - "mosn.io/pkg/log" + "mosn.io/layotto/kit/logger" ) func TestNewDefaultLogger(t *testing.T) { - mosnLogger, err := log.GetOrCreateLogger("stdout", nil) - assert.Nil(t, err) - errorLog := &log.SimpleErrorLog{ - Logger: mosnLogger, - Level: log.DEBUG, - } + log := logger.NewLayottoLogger("test") - logger := NewDefaultLogger(errorLog) + logger := NewDefaultLogger(log) logger.Debugf("test Debugf %d", 100) logger.Debugf("test Debugf", 100) logger.Infof("test Infof") diff --git a/components/configstores/apollo/repository.go b/components/configstores/apollo/repository.go index e479d5b5e8..3c604de7dc 100644 --- a/components/configstores/apollo/repository.go +++ b/components/configstores/apollo/repository.go @@ -21,7 +21,8 @@ import ( "github.com/apolloconfig/agollo/v4" agolloConfig "github.com/apolloconfig/agollo/v4/env/config" - "mosn.io/pkg/log" + + "mosn.io/layotto/kit/logger" ) // An interface to abstract different apollo sdks,also making it easier to write unit tests. @@ -46,10 +47,7 @@ type repoConfig struct { // whether backup config after fetch config from apollo isBackupConfig bool secret string -} - -func init() { - agollo.SetLogger(NewDefaultLogger(log.DefaultLogger)) + logger logger.Logger } // Implement Repository interface @@ -68,6 +66,7 @@ func (a *AgolloRepository) Connect() error { func (a *AgolloRepository) SetConfig(r *repoConfig) { a.cfg = r + agollo.SetLogger(r.logger) } func repoConfig2AgolloConfig(r *repoConfig) *agolloConfig.AppConfig { diff --git a/components/configstores/etcdv3/etcdv3.go b/components/configstores/etcdv3/etcdv3.go index c2330d52fb..c8f1d8c73e 100644 --- a/components/configstores/etcdv3/etcdv3.go +++ b/components/configstores/etcdv3/etcdv3.go @@ -27,7 +27,8 @@ import ( "go.etcd.io/etcd/api/v3/mvccpb" clientv3 "go.etcd.io/etcd/client/v3" - "mosn.io/pkg/log" + + log "mosn.io/layotto/kit/logger" "mosn.io/layotto/components/configstores" "mosn.io/layotto/components/trace" @@ -60,6 +61,7 @@ type EtcdV3ConfigStore struct { cancel context.CancelFunc watchStarted bool watchRespCh chan *configstores.SubscribeResp + log log.Logger } func (c *EtcdV3ConfigStore) GetDefaultGroup() string { @@ -70,19 +72,29 @@ func (c *EtcdV3ConfigStore) GetDefaultLabel() string { return defaultLabel } +func (c *EtcdV3ConfigStore) OnLogLevelChanged(outputLevel log.LogLevel) { + c.log.SetLogLevel(outputLevel) +} + func NewStore() configstores.Store { once.Do(func() { indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} actuators.SetComponentsIndicator(componentName, indicators) }) - return &EtcdV3ConfigStore{subscribeKey: make(map[string]string), watchRespCh: make(chan *configstores.SubscribeResp)} + cs := &EtcdV3ConfigStore{ + subscribeKey: make(map[string]string), + watchRespCh: make(chan *configstores.SubscribeResp), + log: log.NewLayottoLogger("configstore/etcdv3"), + } + log.RegisterComponentLoggerListener("configstore/etcdv3", cs) + return cs } // Init init the configuration store. func (c *EtcdV3ConfigStore) Init(config *configstores.StoreConfig) error { t, err := strconv.Atoi(config.TimeOut) if err != nil { - log.DefaultLogger.Errorf("wrong configuration for time out configuration: %+v, set default value(10s)", config.TimeOut) + c.log.Errorf("wrong configuration for time out configuration: %+v, set default value(10s)", config.TimeOut) t = 10 } c.client, err = clientv3.New(clientv3.Config{ @@ -154,7 +166,7 @@ func (c *EtcdV3ConfigStore) Get(ctx context.Context, req *configstores.GetReques keyValues, err := c.client.Get(ctx, "/"+req.AppId, clientv3.WithPrefix()) res := make([]*configstores.ConfigurationItem, 0) if err != nil { - log.DefaultLogger.Errorf("fail get all group key-value,err: %+v", err) + c.log.Errorf("fail get all group key-value,err: %+v", err) return nil, err } targetString[configstores.Group] = req.Group @@ -176,7 +188,7 @@ func (c *EtcdV3ConfigStore) Set(ctx context.Context, req *configstores.SetReques for _, key := range c.ParseKey(req.AppId, item) { _, err := c.client.Put(ctx, key, item.Content) if err != nil { - log.DefaultLogger.Errorf("set key[%+v] failed with error: %+v", key, err) + c.log.Errorf("set key[%+v] failed with error: %+v", key, err) return err } } @@ -190,7 +202,7 @@ func (c *EtcdV3ConfigStore) Delete(ctx context.Context, req *configstores.Delete res := "/" + req.AppId + "/" + req.Group + "/" + req.Label + "/" + key _, err := c.client.Delete(ctx, res, clientv3.WithPrefix()) if err != nil { - log.DefaultLogger.Errorf("delete key[%+v] failed with error: %+v", key, err) + c.log.Errorf("delete key[%+v] failed with error: %+v", key, err) return err } } diff --git a/components/configstores/nacos/configstore.go b/components/configstores/nacos/configstore.go index e658488f96..f8dd67c0b9 100644 --- a/components/configstores/nacos/configstore.go +++ b/components/configstores/nacos/configstore.go @@ -16,7 +16,6 @@ package nacos import ( "context" "errors" - "path/filepath" "strconv" "strings" "sync" @@ -27,7 +26,8 @@ import ( "github.com/nacos-group/nacos-sdk-go/v2/common/constant" nacoslog "github.com/nacos-group/nacos-sdk-go/v2/common/logger" "github.com/nacos-group/nacos-sdk-go/v2/vo" - "mosn.io/pkg/log" + + log "mosn.io/layotto/kit/logger" "mosn.io/layotto/components/configstores" "mosn.io/layotto/components/pkg/actuators" @@ -54,6 +54,7 @@ type ConfigStore struct { appId string namespaceId string listener sync.Map + log log.Logger } func NewStore() configstores.Store { @@ -61,7 +62,15 @@ func NewStore() configstores.Store { indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} actuators.SetComponentsIndicator(componentName, indicators) }) - return &ConfigStore{} + cs := &ConfigStore{ + log: log.NewLayottoLogger("configstore/nacos"), + } + log.RegisterComponentLoggerListener("configstore/nacos", cs) + return cs +} + +func (n *ConfigStore) OnLogLevelChanged(outputLevel log.LogLevel) { + n.log.SetLogLevel(outputLevel) } // Init SetConfig the configuration store. @@ -98,7 +107,7 @@ func (n *ConfigStore) Init(config *configstores.StoreConfig) (err error) { if config.TimeOut != "" { timeout, err = strconv.Atoi(config.TimeOut) if err != nil { - log.DefaultLogger.Errorf("wrong configuration for time out configuration: %+v, set default value(10s)", config.TimeOut) + n.log.Errorf("wrong configuration for time out configuration: %+v, set default value(10s)", config.TimeOut) return err } } @@ -198,31 +207,21 @@ func (n *ConfigStore) initWithACM(timeoutMs uint64, metadata *Metadata) (config_ } func (n *ConfigStore) setupLogger(metadata *Metadata) error { - roller := log.DefaultRoller() - logFilePath := filepath.Join(metadata.LogDir, defaultLogFileName) - logger, err := log.GetOrCreateLogger(logFilePath, roller) - if err != nil { - return err - } - - errLogger := &log.SimpleErrorLog{ - Logger: logger, - } switch metadata.LogLevel { case DEBUG: - errLogger.Level = log.DEBUG + n.log.SetLogLevel(log.DebugLevel) case INFO: - errLogger.Level = log.INFO + n.log.SetLogLevel(log.InfoLevel) case WARN: - errLogger.Level = log.WARN + n.log.SetLogLevel(log.WarnLevel) case ERROR: - errLogger.Level = log.ERROR + n.log.SetLogLevel(log.ErrorLevel) default: return errors.New("unknown log level") } - nacoslog.SetLogger(NewDefaultLogger(errLogger)) + nacoslog.SetLogger(NewDefaultLogger(n.log)) return nil } @@ -289,7 +288,7 @@ func (n *ConfigStore) getAllWithAppId(ctx context.Context, pagination *Paginatio PageSize: pagination.PageSize, }) if err != nil { - log.DefaultLogger.Errorf("fail get all app_id key-value,err: %+v", err) + n.log.Errorf("fail get all app_id key-value,err: %+v", err) return nil, err } @@ -315,7 +314,7 @@ func (n *ConfigStore) getAllWithGroup(ctx context.Context, group string, paginat PageSize: pagination.PageSize, }) if err != nil { - log.DefaultLogger.Errorf("fail get all group key-value,err: %+v", err) + n.log.Errorf("fail get all group key-value,err: %+v", err) return nil, err } @@ -342,7 +341,7 @@ func (n *ConfigStore) getAllWithKeys(ctx context.Context, group string, keys []s AppName: n.appId, }) if err != nil { - log.DefaultLogger.Errorf("fail get key-value,err: %+v", err) + n.log.Errorf("fail get key-value,err: %+v", err) return nil, err } @@ -386,7 +385,7 @@ func (n *ConfigStore) Set(ctx context.Context, request *configstores.SetRequest) // If the config does not exist, deleting the config will not result in an error. if err != nil { - log.DefaultLogger.Errorf("set key[%+v] failed with error: %+v", configItem.Key, err) + n.log.Errorf("set key[%+v] failed with error: %+v", configItem.Key, err) return err } if !ok { @@ -417,7 +416,7 @@ func (n *ConfigStore) Delete(ctx context.Context, request *configstores.DeleteRe AppName: request.AppId, }) if err != nil { - log.DefaultLogger.Errorf("delete key[%+v] failed with error: %+v", key, err) + n.log.Errorf("delete key[%+v] failed with error: %+v", key, err) return err } if !ok { @@ -514,7 +513,7 @@ func (n *ConfigStore) StopSubscribe() { Group: subscribe.group, AppName: n.appId, }); err != nil { - log.DefaultLogger.Errorf("nacos StopSubscribe key %s-%s-%s failed", n.appId, subscribe.group, subscribe.key) + n.log.Errorf("nacos StopSubscribe key %s-%s-%s failed", n.appId, subscribe.group, subscribe.key) return false } diff --git a/components/configstores/nacos/default_logger.go b/components/configstores/nacos/default_logger.go index f25f403a20..b5e803b482 100644 --- a/components/configstores/nacos/default_logger.go +++ b/components/configstores/nacos/default_logger.go @@ -17,7 +17,7 @@ package nacos import ( - "mosn.io/pkg/log" + log "mosn.io/layotto/kit/logger" ) const ( @@ -29,10 +29,10 @@ const ( // An adapter to implement log.LoggerInterface in agollo package. type DefaultLogger struct { - logger log.ErrorLogger + logger log.Logger } -func NewDefaultLogger(logger log.ErrorLogger) *DefaultLogger { +func NewDefaultLogger(logger log.Logger) *DefaultLogger { return &DefaultLogger{ logger: logger, } diff --git a/components/configstores/nacos/default_logger_test.go b/components/configstores/nacos/default_logger_test.go index 7fe6e0f25a..4e36494a8d 100644 --- a/components/configstores/nacos/default_logger_test.go +++ b/components/configstores/nacos/default_logger_test.go @@ -19,20 +19,14 @@ package nacos import ( "testing" - "github.com/stretchr/testify/assert" - - "mosn.io/pkg/log" + "mosn.io/layotto/kit/logger" ) func TestNewDefaultLogger(t *testing.T) { - mosnLogger, err := log.GetOrCreateLogger("stdout", nil) - assert.Nil(t, err) - errorLog := &log.SimpleErrorLog{ - Logger: mosnLogger, - Level: log.DEBUG, - } + log := logger.NewLayottoLogger("test") + log.SetLogLevel(logger.DebugLevel) - logger := NewDefaultLogger(errorLog) + logger := NewDefaultLogger(log) logger.Debugf("test Debugf %d", 100) logger.Debugf("test Debugf", 100) logger.Infof("test Infof") diff --git a/components/cryption/aliyun/kms.go b/components/cryption/aliyun/kms.go index d30fd15835..d6881da7e4 100644 --- a/components/cryption/aliyun/kms.go +++ b/components/cryption/aliyun/kms.go @@ -25,7 +25,8 @@ import ( openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client" kms20160120 "github.com/alibabacloud-go/kms-20160120/v3/client" "github.com/alibabacloud-go/tea/tea" - "mosn.io/pkg/log" + + log "mosn.io/layotto/kit/logger" "mosn.io/layotto/components/cryption" ) @@ -48,6 +49,7 @@ func init() { type cy struct { client *kms20160120.Client keyID string + log log.Logger } /* @@ -58,7 +60,15 @@ func NewCryption() cryption.CryptionService { indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} actuators.SetComponentsIndicator(componentName, indicators) }) - return &cy{} + cryption := &cy{ + log: log.NewLayottoLogger("cryption/aliyun"), + } + log.RegisterComponentLoggerListener("cryption/aliyun", cryption) + return cryption +} + +func (k *cy) OnLogLevelChanged(outputLevel log.LogLevel) { + k.log.SetLogLevel(outputLevel) } func (k *cy) Init(ctx context.Context, conf *cryption.Config) error { @@ -93,7 +103,7 @@ func (k *cy) Decrypt(ctx context.Context, request *cryption.DecryptRequest) (*cr } decryptResp, err := k.client.Decrypt(decryptRequest) if err != nil { - log.DefaultLogger.Errorf("fail decrypt data, err: %+v", err) + k.log.Errorf("fail decrypt data, err: %+v", err) return nil, fmt.Errorf("fail decrypt data with error: %+v", err) } resp := &cryption.DecryptResponse{KeyId: *decryptResp.Body.KeyId, KeyVersionId: *decryptResp.Body.KeyVersionId, @@ -115,7 +125,7 @@ func (k *cy) Encrypt(ctx context.Context, request *cryption.EncryptRequest) (*cr encryptResp, err := k.client.Encrypt(encryptRequest) if err != nil { - log.DefaultLogger.Errorf("fail encrypt data, err: %+v", err) + k.log.Errorf("fail encrypt data, err: %+v", err) return nil, fmt.Errorf("fail encrypt data with error: %+v", err) } resp := &cryption.EncryptResponse{KeyId: *encryptResp.Body.KeyId, KeyVersionId: *encryptResp.Body.KeyVersionId, diff --git a/components/cryption/aws/kms.go b/components/cryption/aws/kms.go index 50cdcb0806..f09083a694 100644 --- a/components/cryption/aws/kms.go +++ b/components/cryption/aws/kms.go @@ -26,7 +26,8 @@ import ( "github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/kms" - "mosn.io/pkg/log" + + log "mosn.io/layotto/kit/logger" "mosn.io/layotto/components/cryption" ) @@ -49,6 +50,7 @@ func init() { type cy struct { client *kms.KMS keyID string + log log.Logger } func NewCryption() cryption.CryptionService { @@ -56,7 +58,15 @@ func NewCryption() cryption.CryptionService { indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} actuators.SetComponentsIndicator(componentName, indicators) }) - return &cy{} + c := &cy{ + log: log.NewLayottoLogger("cryption/aws"), + } + log.RegisterComponentLoggerListener("cryption/aws", c) + return c +} + +func (k *cy) OnLogLevelChanged(outputLevel log.LogLevel) { + k.log.SetLogLevel(outputLevel) } func (k *cy) Init(ctx context.Context, conf *cryption.Config) error { @@ -88,7 +98,7 @@ func (k *cy) Decrypt(ctx context.Context, request *cryption.DecryptRequest) (*cr } decryptResp, err := k.client.Decrypt(decryptRequest) if err != nil { - log.DefaultLogger.Errorf("fail decrypt data, err: %+v", err) + k.log.Errorf("fail decrypt data, err: %+v", err) return nil, fmt.Errorf("fail decrypt data with error: %+v", err) } resp := &cryption.DecryptResponse{KeyId: *decryptResp.KeyId, PlainText: decryptResp.Plaintext} @@ -108,7 +118,7 @@ func (k *cy) Encrypt(ctx context.Context, request *cryption.EncryptRequest) (*cr encryptResp, err := k.client.Encrypt(encryptRequest) if err != nil { - log.DefaultLogger.Errorf("fail encrypt data, err: %+v", err) + k.log.Errorf("fail encrypt data, err: %+v", err) return nil, fmt.Errorf("fail encrypt data with error: %+v", err) } resp := &cryption.EncryptResponse{KeyId: *encryptResp.KeyId, CipherText: encryptResp.CiphertextBlob} diff --git a/components/go.mod b/components/go.mod index 4b4d1d255e..0ef3103729 100644 --- a/components/go.mod +++ b/components/go.mod @@ -48,6 +48,7 @@ require ( google.golang.org/grpc v1.48.0 google.golang.org/protobuf v1.27.1 mosn.io/api v1.3.0 + mosn.io/layotto/kit v0.0.0-00010101000000-000000000000 mosn.io/layotto/spec v0.0.0-20231023045845-48ec2bc7eab8 mosn.io/mosn v1.3.0 mosn.io/pkg v1.3.0 @@ -164,7 +165,7 @@ require ( github.com/rs/xid v1.2.1 // indirect github.com/russross/blackfriday/v2 v2.0.1 // indirect github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect - github.com/sirupsen/logrus v1.8.1 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect github.com/soheilhy/cmux v0.1.5 // indirect github.com/spf13/afero v1.2.2 // indirect github.com/spf13/cast v1.3.1 // indirect @@ -224,3 +225,5 @@ require ( replace github.com/klauspost/compress => github.com/klauspost/compress v1.13.1 replace mosn.io/layotto/spec => ../spec + +replace mosn.io/layotto/kit => ../kit diff --git a/components/go.sum b/components/go.sum index a829722da3..06a8374161 100644 --- a/components/go.sum +++ b/components/go.sum @@ -97,8 +97,8 @@ github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZ github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= @@ -1141,8 +1141,9 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.1.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= @@ -1629,6 +1630,7 @@ golang.org/x/sys v0.0.0-20211020174200-9d6173849985/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= diff --git a/components/lock/consul/consul_lock.go b/components/lock/consul/consul_lock.go index bab45a4799..4ec11d2672 100644 --- a/components/lock/consul/consul_lock.go +++ b/components/lock/consul/consul_lock.go @@ -21,7 +21,8 @@ import ( "github.com/hashicorp/consul/api" msync "mosn.io/mosn/pkg/sync" - "mosn.io/pkg/log" + + log "mosn.io/layotto/kit/logger" "mosn.io/layotto/components/lock" "mosn.io/layotto/components/pkg/actuators" @@ -45,7 +46,7 @@ func init() { type ConsulLock struct { metadata utils.ConsulMetadata - logger log.ErrorLogger + log log.Logger client utils.ConsulClient sessionFactory utils.SessionFactory kv utils.ConsulKV @@ -53,15 +54,22 @@ type ConsulLock struct { workPool msync.WorkerPool } -func NewConsulLock(logger log.ErrorLogger) *ConsulLock { +func NewConsulLock() *ConsulLock { once.Do(func() { indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} actuators.SetComponentsIndicator(componentName, indicators) }) - consulLock := &ConsulLock{logger: logger} + consulLock := &ConsulLock{ + log: log.NewLayottoLogger("lock/consul"), + } + log.RegisterComponentLoggerListener("lock/consul", consulLock) return consulLock } +func (c *ConsulLock) OnLogLevelChanged(outputLevel log.LogLevel) { + c.log.SetLogLevel(outputLevel) +} + func (c *ConsulLock) Init(metadata lock.Metadata) error { consulMetadata, err := utils.ParseConsulMetadata(metadata) if err != nil { @@ -159,7 +167,7 @@ func (c *ConsulLock) Unlock(ctx context.Context, req *lock.UnlockRequest) (*lock c.sMap.Delete(req.LockOwner + "-" + req.ResourceId) _, err = c.sessionFactory.Destroy(session.(string), nil) if err != nil { - c.logger.Errorf("consul lock session destroy error: %v", err) + c.log.Errorf("consul lock session destroy error: %v", err) } return &lock.UnlockResponse{Status: lock. SUCCESS}, nil diff --git a/components/lock/consul/consul_lock_test.go b/components/lock/consul/consul_lock_test.go index 14db8bb8da..ada52687a4 100644 --- a/components/lock/consul/consul_lock_test.go +++ b/components/lock/consul/consul_lock_test.go @@ -19,7 +19,6 @@ import ( "github.com/golang/mock/gomock" "github.com/hashicorp/consul/api" "github.com/stretchr/testify/assert" - "mosn.io/pkg/log" "mosn.io/layotto/components/lock" "mosn.io/layotto/components/pkg/mock" @@ -33,7 +32,7 @@ const expireTime = 5 // Init with wrong config func TestConsulLock_InitWithWrongConfig(t *testing.T) { t.Run("when no address then error", func(t *testing.T) { - comp := NewConsulLock(log.DefaultLogger) + comp := NewConsulLock() cfg := lock.Metadata{ Properties: make(map[string]string), } @@ -45,7 +44,7 @@ func TestConsulLock_InitWithWrongConfig(t *testing.T) { // Test features func TestConsulLock_Features(t *testing.T) { - comp := NewConsulLock(log.DefaultLogger) + comp := NewConsulLock() assert.True(t, len(comp.Features()) == 0) } @@ -57,7 +56,7 @@ func TestConsulLock_TryLock(t *testing.T) { factory := mock.NewMockSessionFactory(ctrl) kv := mock.NewMockConsulKV(ctrl) - comp := NewConsulLock(log.DefaultLogger) + comp := NewConsulLock() cfg := lock.Metadata{ Properties: make(map[string]string), } @@ -103,7 +102,7 @@ func TestConsulLock_ALock_BLock(t *testing.T) { factory := mock.NewMockSessionFactory(ctrl) kv := mock.NewMockConsulKV(ctrl) - comp := NewConsulLock(log.DefaultLogger) + comp := NewConsulLock() cfg := lock.Metadata{ Properties: make(map[string]string), } @@ -149,7 +148,7 @@ func TestConsulLock_ALock_BUnlock(t *testing.T) { factory := mock.NewMockSessionFactory(ctrl) kv := mock.NewMockConsulKV(ctrl) - comp := NewConsulLock(log.DefaultLogger) + comp := NewConsulLock() cfg := lock.Metadata{ Properties: make(map[string]string), } diff --git a/components/lock/etcd/etcd_lock.go b/components/lock/etcd/etcd_lock.go index b888d89a38..395d1e7083 100644 --- a/components/lock/etcd/etcd_lock.go +++ b/components/lock/etcd/etcd_lock.go @@ -22,7 +22,7 @@ import ( "mosn.io/layotto/components/pkg/utils" - "mosn.io/pkg/log" + "mosn.io/layotto/kit/logger" "mosn.io/layotto/components/lock" "mosn.io/layotto/components/pkg/actuators" @@ -49,26 +49,30 @@ type EtcdLock struct { metadata utils.EtcdMetadata features []lock.Feature - logger log.ErrorLogger ctx context.Context cancel context.CancelFunc + logger logger.Logger } // NewEtcdLock returns a new etcd lock -func NewEtcdLock(logger log.ErrorLogger) *EtcdLock { +func NewEtcdLock() *EtcdLock { once.Do(func() { indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} actuators.SetComponentsIndicator(componentName, indicators) }) s := &EtcdLock{ features: make([]lock.Feature, 0), - logger: logger, + logger: logger.NewLayottoLogger("lock/etcd"), } - + logger.RegisterComponentLoggerListener("lock/etcd", s) return s } +func (e *EtcdLock) OnLogLevelChanged(outputLevel logger.LogLevel) { + e.logger.SetLogLevel(outputLevel) +} + // Init EtcdLock func (e *EtcdLock) Init(metadata lock.Metadata) error { // 1. parse config diff --git a/components/lock/etcd/etcd_lock_test.go b/components/lock/etcd/etcd_lock_test.go index 4474ed689d..aecb43d54e 100644 --- a/components/lock/etcd/etcd_lock_test.go +++ b/components/lock/etcd/etcd_lock_test.go @@ -21,8 +21,6 @@ import ( "testing" "time" - "mosn.io/pkg/log" - "mosn.io/layotto/components/lock" "github.com/google/uuid" @@ -48,7 +46,7 @@ func TestEtcdLock_Init(t *testing.T) { etcdServer.Server.Stop() os.RemoveAll(etcdTestDir) }() - comp := NewEtcdLock(log.DefaultLogger) + comp := NewEtcdLock() cfg := lock.Metadata{ Properties: make(map[string]string), @@ -82,7 +80,7 @@ func TestEtcdLock_Init(t *testing.T) { func TestEtcdLock_CreateConnTimeout(t *testing.T) { var err error - comp := NewEtcdLock(log.DefaultLogger) + comp := NewEtcdLock() cfg := lock.Metadata{ Properties: make(map[string]string), @@ -112,7 +110,7 @@ func TestEtcdLock_TryLock(t *testing.T) { os.RemoveAll(etcdTestDir) }() - comp := NewEtcdLock(log.DefaultLogger) + comp := NewEtcdLock() cfg := lock.Metadata{ Properties: make(map[string]string), @@ -183,7 +181,7 @@ func TestEtcdLock_UnLock(t *testing.T) { os.RemoveAll(etcdTestDir) }() - comp := NewEtcdLock(log.DefaultLogger) + comp := NewEtcdLock() cfg := lock.Metadata{ Properties: make(map[string]string), diff --git a/components/lock/mongo/mongo_lock.go b/components/lock/mongo/mongo_lock.go index 58818db8e4..d9254d8ef8 100644 --- a/components/lock/mongo/mongo_lock.go +++ b/components/lock/mongo/mongo_lock.go @@ -25,7 +25,8 @@ import ( "go.mongodb.org/mongo-driver/mongo/readconcern" "go.mongodb.org/mongo-driver/mongo/writeconcern" "go.mongodb.org/mongo-driver/x/bsonx" - "mosn.io/pkg/log" + + "mosn.io/layotto/kit/logger" "mosn.io/layotto/components/lock" "mosn.io/layotto/components/pkg/actuators" @@ -63,25 +64,30 @@ type MongoLock struct { metadata utils.MongoMetadata features []lock.Feature - logger log.ErrorLogger + logger logger.Logger ctx context.Context cancel context.CancelFunc } // NewMongoLock returns a new mongo lock -func NewMongoLock(logger log.ErrorLogger) *MongoLock { +func NewMongoLock() *MongoLock { once.Do(func() { indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} actuators.SetComponentsIndicator(componentName, indicators) }) s := &MongoLock{ features: make([]lock.Feature, 0), - logger: logger, + logger: logger.NewLayottoLogger("lock/mongo"), } + logger.RegisterComponentLoggerListener("lock/mongo", s) return s } +func (e *MongoLock) OnLogLevelChanged(outputLevel logger.LogLevel) { + e.logger.SetLogLevel(outputLevel) +} + func (e *MongoLock) Init(metadata lock.Metadata) error { var client utils.MongoClient // 1.parse config diff --git a/components/lock/mongo/mongo_lock_test.go b/components/lock/mongo/mongo_lock_test.go index 5ac4e1174d..e318a2a634 100644 --- a/components/lock/mongo/mongo_lock_test.go +++ b/components/lock/mongo/mongo_lock_test.go @@ -21,7 +21,6 @@ import ( "github.com/stretchr/testify/assert" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" - "mosn.io/pkg/log" "mosn.io/layotto/components/lock" "mosn.io/layotto/components/pkg/mock" @@ -37,7 +36,7 @@ const ( func TestMongoLock_Init(t *testing.T) { var err error var mongoUrl = "localhost:27017" - comp := NewMongoLock(log.DefaultLogger) + comp := NewMongoLock() cfg := lock.Metadata{ Properties: make(map[string]string), @@ -60,7 +59,7 @@ func TestMongoLock_TryLock(t *testing.T) { var err error var resp *lock.TryLockResponse var mongoUrl = "localhost:xxxx" - comp := NewMongoLock(log.DefaultLogger) + comp := NewMongoLock() cfg := lock.Metadata{ Properties: make(map[string]string), @@ -136,7 +135,7 @@ func TestMongoLock_Unlock(t *testing.T) { var lockresp *lock.TryLockResponse var mongoUrl = "localhost:xxxx" - comp := NewMongoLock(log.DefaultLogger) + comp := NewMongoLock() cfg := lock.Metadata{ Properties: make(map[string]string), diff --git a/components/lock/redis/cluster_redis_lock.go b/components/lock/redis/cluster_redis_lock.go index c2faba95b7..43924a2c2b 100644 --- a/components/lock/redis/cluster_redis_lock.go +++ b/components/lock/redis/cluster_redis_lock.go @@ -22,7 +22,8 @@ import ( "github.com/go-redis/redis/v8" msync "mosn.io/mosn/pkg/sync" - "mosn.io/pkg/log" + + "mosn.io/layotto/kit/logger" "mosn.io/layotto/components/lock" "mosn.io/layotto/components/pkg/actuators" @@ -52,26 +53,31 @@ type ClusterRedisLock struct { workpool msync.WorkerPool features []lock.Feature - logger log.ErrorLogger + logger logger.Logger ctx context.Context cancel context.CancelFunc } // NewClusterRedisLock returns a new redis lock store -func NewClusterRedisLock(logger log.ErrorLogger) *ClusterRedisLock { +func NewClusterRedisLock() *ClusterRedisLock { once.Do(func() { indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} actuators.SetComponentsIndicator(componentName, indicators) }) s := &ClusterRedisLock{ features: make([]lock.Feature, 0), - logger: logger, + logger: logger.NewLayottoLogger("lock/redis"), } + logger.RegisterComponentLoggerListener("lock/redis", s) return s } +func (c *ClusterRedisLock) OnLogLevelChanged(outputLevel logger.LogLevel) { + c.logger.SetLogLevel(outputLevel) +} + type resultMsg struct { error error host string diff --git a/components/lock/redis/cluster_redis_lock_test.go b/components/lock/redis/cluster_redis_lock_test.go index 812ab0cca0..cdcf2c19bf 100644 --- a/components/lock/redis/cluster_redis_lock_test.go +++ b/components/lock/redis/cluster_redis_lock_test.go @@ -21,7 +21,6 @@ import ( miniredis "github.com/alicebob/miniredis/v2" "github.com/google/uuid" "github.com/stretchr/testify/assert" - "mosn.io/pkg/log" "mosn.io/layotto/components/lock" ) @@ -34,7 +33,7 @@ const ( func TestClusterRedisLock_InitError(t *testing.T) { t.Run("error when connection fail", func(t *testing.T) { // construct component - comp := NewClusterRedisLock(log.DefaultLogger) + comp := NewClusterRedisLock() cfg := lock.Metadata{ Properties: make(map[string]string), @@ -49,7 +48,7 @@ func TestClusterRedisLock_InitError(t *testing.T) { t.Run("error when no host", func(t *testing.T) { // construct component - comp := NewClusterRedisLock(log.DefaultLogger) + comp := NewClusterRedisLock() cfg := lock.Metadata{ Properties: make(map[string]string), @@ -64,7 +63,7 @@ func TestClusterRedisLock_InitError(t *testing.T) { t.Run("error when wrong MaxRetries", func(t *testing.T) { // construct component - comp := NewClusterRedisLock(log.DefaultLogger) + comp := NewClusterRedisLock() cfg := lock.Metadata{ Properties: make(map[string]string), @@ -90,7 +89,7 @@ func TestClusterRedisLock_TryLock(t *testing.T) { redisAddrs = append(redisAddrs, redis.Addr()) } // construct component - comp := NewClusterRedisLock(log.DefaultLogger) + comp := NewClusterRedisLock() cfg := lock.Metadata{ Properties: make(map[string]string), } diff --git a/components/lock/redis/standalone_redis_lock.go b/components/lock/redis/standalone_redis_lock.go index eb7e72ba1d..4c3ce40e71 100644 --- a/components/lock/redis/standalone_redis_lock.go +++ b/components/lock/redis/standalone_redis_lock.go @@ -19,7 +19,8 @@ import ( "time" "github.com/go-redis/redis/v8" - "mosn.io/pkg/log" + + "mosn.io/layotto/kit/logger" "mosn.io/layotto/components/lock" "mosn.io/layotto/components/pkg/actuators" @@ -37,26 +38,31 @@ type StandaloneRedisLock struct { metadata utils.RedisMetadata features []lock.Feature - logger log.ErrorLogger + logger logger.Logger ctx context.Context cancel context.CancelFunc } // NewStandaloneRedisLock returns a new redis lock store -func NewStandaloneRedisLock(logger log.ErrorLogger) *StandaloneRedisLock { +func NewStandaloneRedisLock() *StandaloneRedisLock { once.Do(func() { indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} actuators.SetComponentsIndicator("lock-redis-standalone", indicators) }) s := &StandaloneRedisLock{ features: make([]lock.Feature, 0), - logger: logger, + logger: logger.NewLayottoLogger("lock/standalone_redis"), } + logger.RegisterComponentLoggerListener("lock/standalone_redis", s) return s } +func (p *StandaloneRedisLock) OnLogLevelChanged(outputLevel logger.LogLevel) { + p.logger.SetLogLevel(outputLevel) +} + // Init StandaloneRedisLock func (p *StandaloneRedisLock) Init(metadata lock.Metadata) error { // 1. parse config diff --git a/components/lock/redis/standalone_redis_lock_test.go b/components/lock/redis/standalone_redis_lock_test.go index 6e4ab0dded..bbee139112 100644 --- a/components/lock/redis/standalone_redis_lock_test.go +++ b/components/lock/redis/standalone_redis_lock_test.go @@ -20,7 +20,6 @@ import ( miniredis "github.com/alicebob/miniredis/v2" "github.com/google/uuid" "github.com/stretchr/testify/assert" - "mosn.io/pkg/log" "mosn.io/layotto/components/lock" ) @@ -30,7 +29,7 @@ const resourceId = "resource_xxx" func TestStandaloneRedisLock_InitError(t *testing.T) { t.Run("error when connection fail", func(t *testing.T) { // construct component - comp := NewStandaloneRedisLock(log.DefaultLogger) + comp := NewStandaloneRedisLock() defer comp.Close() cfg := lock.Metadata{ @@ -46,7 +45,7 @@ func TestStandaloneRedisLock_InitError(t *testing.T) { t.Run("error when no host", func(t *testing.T) { // construct component - comp := NewStandaloneRedisLock(log.DefaultLogger) + comp := NewStandaloneRedisLock() defer comp.Close() cfg := lock.Metadata{ @@ -62,7 +61,7 @@ func TestStandaloneRedisLock_InitError(t *testing.T) { t.Run("error when wrong MaxRetries", func(t *testing.T) { // construct component - comp := NewStandaloneRedisLock(log.DefaultLogger) + comp := NewStandaloneRedisLock() defer comp.Close() cfg := lock.Metadata{ @@ -86,7 +85,7 @@ func TestStandaloneRedisLock_TryLock(t *testing.T) { assert.NoError(t, err) defer s.Close() // construct component - comp := NewStandaloneRedisLock(log.DefaultLogger) + comp := NewStandaloneRedisLock() defer comp.Close() cfg := lock.Metadata{ diff --git a/components/lock/zookeeper/zookeeper_lock.go b/components/lock/zookeeper/zookeeper_lock.go index e0b6326c0e..2a49a64778 100644 --- a/components/lock/zookeeper/zookeeper_lock.go +++ b/components/lock/zookeeper/zookeeper_lock.go @@ -20,9 +20,10 @@ import ( "time" "github.com/go-zookeeper/zk" - "mosn.io/pkg/log" util "mosn.io/pkg/utils" + "mosn.io/layotto/kit/logger" + "mosn.io/layotto/components/lock" "mosn.io/layotto/components/pkg/actuators" "mosn.io/layotto/components/pkg/utils" @@ -57,21 +58,27 @@ type ZookeeperLock struct { //unlock reuse this conneciton unlockConn utils.ZKConnection metadata utils.ZookeeperMetadata - logger log.ErrorLogger + logger logger.Logger } // NewZookeeperLock Create ZookeeperLock -func NewZookeeperLock(logger log.ErrorLogger) *ZookeeperLock { +func NewZookeeperLock() *ZookeeperLock { once.Do(func() { indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} actuators.SetComponentsIndicator(componentName, indicators) }) lock := &ZookeeperLock{ - logger: logger, + logger: logger.NewLayottoLogger("lock/zookeeper"), } + logger.RegisterComponentLoggerListener("lock/zookeeper", lock) return lock } +// OnLogLevelChanged change log level +func (p *ZookeeperLock) OnLogLevelChanged(level logger.LogLevel) { + p.logger.SetLogLevel(level) +} + // Init ZookeeperLock func (p *ZookeeperLock) Init(metadata lock.Metadata) error { diff --git a/components/lock/zookeeper/zookeeper_lock_test.go b/components/lock/zookeeper/zookeeper_lock_test.go index 51268201ef..286bdd717f 100644 --- a/components/lock/zookeeper/zookeeper_lock_test.go +++ b/components/lock/zookeeper/zookeeper_lock_test.go @@ -25,7 +25,6 @@ import ( "github.com/go-zookeeper/zk" "github.com/golang/mock/gomock" "github.com/stretchr/testify/assert" - "mosn.io/pkg/log" "mosn.io/layotto/components/lock" "mosn.io/layotto/components/pkg/mock" @@ -54,7 +53,7 @@ func TestMain(m *testing.M) { // A lock ,A unlock func TestZookeeperLock_ALock_AUnlock(t *testing.T) { - comp := NewZookeeperLock(log.DefaultLogger) + comp := NewZookeeperLock() comp.Init(cfg) //mock @@ -89,7 +88,7 @@ func TestZookeeperLock_ALock_AUnlock(t *testing.T) { // A lock ,B unlock func TestZookeeperLock_ALock_BUnlock(t *testing.T) { - comp := NewZookeeperLock(log.DefaultLogger) + comp := NewZookeeperLock() comp.Init(cfg) //mock @@ -123,7 +122,7 @@ func TestZookeeperLock_ALock_BUnlock(t *testing.T) { // A lock , B lock ,A unlock ,B lock,B unlock func TestZookeeperLock_ALock_BLock_AUnlock_BLock_BUnlock(t *testing.T) { - comp := NewZookeeperLock(log.DefaultLogger) + comp := NewZookeeperLock() comp.Init(cfg) //mock diff --git a/components/oss/aws/oss.go b/components/oss/aws/oss.go index a719dec21e..a1103f2d66 100644 --- a/components/oss/aws/oss.go +++ b/components/oss/aws/oss.go @@ -40,7 +40,8 @@ import ( "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/jinzhu/copier" - "mosn.io/pkg/log" + + "mosn.io/layotto/kit/logger" ) const ( @@ -61,6 +62,7 @@ func init() { type AwsOss struct { client *s3.Client basicConf json.RawMessage + logger logger.Logger } func NewAwsOss() oss.Oss { @@ -68,7 +70,15 @@ func NewAwsOss() oss.Oss { indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} actuators.SetComponentsIndicator(componentName, indicators) }) - return &AwsOss{} + ao := &AwsOss{ + logger: logger.NewLayottoLogger("oss/aws"), + } + logger.RegisterComponentLoggerListener("oss/aws", ao) + return ao +} + +func (a *AwsOss) OnLogLevelChanged(level logger.LogLevel) { + a.logger.SetLogLevel(level) } func (a *AwsOss) Init(ctx context.Context, config *oss.Config) error { @@ -314,7 +324,7 @@ func (a *AwsOss) CreateMultipartUpload(ctx context.Context, req *oss.CreateMulti input := &s3.CreateMultipartUploadInput{} err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{oss.Int64ToTime}}) if err != nil { - log.DefaultLogger.Errorf("copy CreateMultipartUploadInput fail, err: %+v", err) + a.logger.Errorf("copy CreateMultipartUploadInput fail, err: %+v", err) return nil, err } resp, err := client.CreateMultipartUpload(ctx, input) diff --git a/components/oss/ceph/oss.go b/components/oss/ceph/oss.go index 20fe565201..d60c10c448 100644 --- a/components/oss/ceph/oss.go +++ b/components/oss/ceph/oss.go @@ -33,7 +33,8 @@ import ( "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/jinzhu/copier" - "mosn.io/pkg/log" + + "mosn.io/layotto/kit/logger" "mosn.io/layotto/components/oss" "mosn.io/layotto/components/pkg/actuators" @@ -58,6 +59,7 @@ func init() { type CephOSS struct { client *s3.Client basicConf json.RawMessage + logger logger.Logger } func NewCephOss() oss.Oss { @@ -65,7 +67,15 @@ func NewCephOss() oss.Oss { indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} actuators.SetComponentsIndicator(componentName, indicators) }) - return &CephOSS{} + coss := &CephOSS{ + logger: logger.NewLayottoLogger("oss/ceph"), + } + logger.RegisterComponentLoggerListener("oss/ceph", coss) + return coss +} + +func (c *CephOSS) OnLogLevelChanged(level logger.LogLevel) { + c.logger.SetLogLevel(level) } func (c *CephOSS) Init(ctx context.Context, config *oss.Config) error { @@ -342,7 +352,7 @@ func (c *CephOSS) CreateMultipartUpload(ctx context.Context, req *oss.CreateMult input := &s3.CreateMultipartUploadInput{} err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{oss.Int64ToTime}}) if err != nil { - log.DefaultLogger.Errorf("copy CreateMultipartUploadInput fail, err: %+v", err) + c.logger.Errorf("copy CreateMultipartUploadInput fail, err: %+v", err) return nil, err } resp, err := client.CreateMultipartUpload(ctx, input) diff --git a/components/sequencer/etcd/store.go b/components/sequencer/etcd/store.go index 9ee4f191f8..4b0e3e3bd8 100644 --- a/components/sequencer/etcd/store.go +++ b/components/sequencer/etcd/store.go @@ -19,7 +19,8 @@ import ( "sync" clientv3 "go.etcd.io/etcd/client/v3" - "mosn.io/pkg/log" + + "mosn.io/layotto/kit/logger" "mosn.io/layotto/components/pkg/actuators" "mosn.io/layotto/components/pkg/utils" @@ -46,25 +47,29 @@ type EtcdSequencer struct { metadata utils.EtcdMetadata biggerThan map[string]int64 - logger log.ErrorLogger + logger logger.Logger ctx context.Context cancel context.CancelFunc } // EtcdSequencer returns a new etcd sequencer -func NewEtcdSequencer(logger log.ErrorLogger) *EtcdSequencer { +func NewEtcdSequencer() *EtcdSequencer { once.Do(func() { indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} actuators.SetComponentsIndicator(componentName, indicators) }) s := &EtcdSequencer{ - logger: logger, + logger: logger.NewLayottoLogger("sequencer/etcd"), } - + logger.RegisterComponentLoggerListener("sequencer/etcd", s) return s } +func (e *EtcdSequencer) OnLogLevelChanged(level logger.LogLevel) { + e.logger.SetLogLevel(level) +} + func (e *EtcdSequencer) Init(config sequencer.Configuration) error { // 1. parse config m, err := utils.ParseEtcdMetadata(config.Properties) diff --git a/components/sequencer/etcd/store_test.go b/components/sequencer/etcd/store_test.go index 2ae4188da2..c7d690f054 100644 --- a/components/sequencer/etcd/store_test.go +++ b/components/sequencer/etcd/store_test.go @@ -21,8 +21,6 @@ import ( "testing" "time" - "mosn.io/pkg/log" - "mosn.io/layotto/components/sequencer" "github.com/stretchr/testify/assert" @@ -59,7 +57,7 @@ func TestEtcd_Init(t *testing.T) { etcdServer.Server.Stop() os.RemoveAll(etcdTestDir) }() - comp := NewEtcdSequencer(log.DefaultLogger) + comp := NewEtcdSequencer() cfg := sequencer.Configuration{ BiggerThan: nil, @@ -94,7 +92,7 @@ func TestEtcd_Init(t *testing.T) { func TestEtcd_CreateConnTimeout(t *testing.T) { var err error - comp := NewEtcdSequencer(log.DefaultLogger) + comp := NewEtcdSequencer() cfg := sequencer.Configuration{ BiggerThan: nil, @@ -126,7 +124,7 @@ func TestEtcd_GetNextId(t *testing.T) { os.RemoveAll(etcdTestDir) }() - comp := NewEtcdSequencer(log.DefaultLogger) + comp := NewEtcdSequencer() cfg := sequencer.Configuration{ BiggerThan: nil, diff --git a/components/sequencer/mongo/mongo_sequencer.go b/components/sequencer/mongo/mongo_sequencer.go index 5080bfa5ce..da27cbcbe8 100644 --- a/components/sequencer/mongo/mongo_sequencer.go +++ b/components/sequencer/mongo/mongo_sequencer.go @@ -22,7 +22,8 @@ import ( "go.mongodb.org/mongo-driver/mongo/options" "go.mongodb.org/mongo-driver/mongo/readconcern" "go.mongodb.org/mongo-driver/mongo/writeconcern" - "mosn.io/pkg/log" + + "mosn.io/layotto/kit/logger" "mosn.io/layotto/components/pkg/actuators" "mosn.io/layotto/components/pkg/utils" @@ -54,7 +55,7 @@ type MongoSequencer struct { metadata utils.MongoMetadata biggerThan map[string]int64 - logger log.ErrorLogger + logger logger.Logger ctx context.Context cancel context.CancelFunc @@ -66,18 +67,23 @@ type SequencerDocument struct { } // MongoSequencer returns a new mongo sequencer -func NewMongoSequencer(logger log.ErrorLogger) *MongoSequencer { +func NewMongoSequencer() *MongoSequencer { once.Do(func() { indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} actuators.SetComponentsIndicator(componentName, indicators) }) m := &MongoSequencer{ - logger: logger, + logger: logger.NewLayottoLogger("sequencer/mongo"), } + logger.RegisterComponentLoggerListener("sequencer/mongo", m) return m } +func (e *MongoSequencer) OnLogLevelChanged(level logger.LogLevel) { + e.logger.SetLogLevel(level) +} + func (e *MongoSequencer) Init(config sequencer.Configuration) error { var document SequencerDocument // 1.parse config diff --git a/components/sequencer/mongo/mongo_sequencer_test.go b/components/sequencer/mongo/mongo_sequencer_test.go index 49c60e5d5a..2c5a590f2b 100644 --- a/components/sequencer/mongo/mongo_sequencer_test.go +++ b/components/sequencer/mongo/mongo_sequencer_test.go @@ -18,7 +18,6 @@ import ( "github.com/stretchr/testify/assert" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" - "mosn.io/pkg/log" "mosn.io/layotto/components/pkg/mock" "mosn.io/layotto/components/sequencer" @@ -28,7 +27,7 @@ const key = "resource_xxx" func TestMongoSequencer_Init(t *testing.T) { var mongoUrl = "localhost:xxxxx" - comp := NewMongoSequencer(log.DefaultLogger) + comp := NewMongoSequencer() cfg := sequencer.Configuration{ BiggerThan: nil, @@ -44,7 +43,7 @@ func TestMongoSequencer_Init(t *testing.T) { func TestMongoSequencer_GetNextId(t *testing.T) { var mongoUrl = "localhost:27017" - comp := NewMongoSequencer(log.DefaultLogger) + comp := NewMongoSequencer() cfg := sequencer.Configuration{ BiggerThan: nil, @@ -87,7 +86,7 @@ func TestMongoSequencer_GetNextId(t *testing.T) { func TestMongoSequencer_Close(t *testing.T) { var mongoUrl = "localhost:xxxxx" - comp := NewMongoSequencer(log.DefaultLogger) + comp := NewMongoSequencer() cfg := sequencer.Configuration{ BiggerThan: nil, @@ -120,7 +119,7 @@ func TestMongoSequencer_Close(t *testing.T) { func TestMongoSequencer_GetSegment(t *testing.T) { var mongoUrl = "localhost:xxxxx" - comp := NewMongoSequencer(log.DefaultLogger) + comp := NewMongoSequencer() cfg := sequencer.Configuration{ BiggerThan: nil, diff --git a/components/sequencer/mysql/mysql.go b/components/sequencer/mysql/mysql.go index 1e8f7dbb2e..0f0c467835 100644 --- a/components/sequencer/mysql/mysql.go +++ b/components/sequencer/mysql/mysql.go @@ -17,7 +17,7 @@ import ( "fmt" "sync" - "mosn.io/pkg/log" + "mosn.io/layotto/kit/logger" "mosn.io/layotto/components/pkg/actuators" "mosn.io/layotto/components/pkg/utils" @@ -42,22 +42,27 @@ func init() { type MySQLSequencer struct { metadata utils.MySQLMetadata biggerThan map[string]int64 - logger log.ErrorLogger + logger logger.Logger db *sql.DB } -func NewMySQLSequencer(logger log.ErrorLogger) *MySQLSequencer { +func NewMySQLSequencer() *MySQLSequencer { once.Do(func() { indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} actuators.SetComponentsIndicator(componentName, indicators) }) s := &MySQLSequencer{ - logger: logger, + logger: logger.NewLayottoLogger("sequencer/mysql"), } + logger.RegisterComponentLoggerListener("sequencer/mysql", s) return s } +func (e *MySQLSequencer) OnLogLevelChanged(level logger.LogLevel) { + e.logger.SetLogLevel(level) +} + func (e *MySQLSequencer) Init(config sequencer.Configuration) error { m, err := utils.ParseMySQLMetadata(config.Properties) diff --git a/components/sequencer/mysql/mysql_test.go b/components/sequencer/mysql/mysql_test.go index a3c4996f45..4fab05d9c1 100644 --- a/components/sequencer/mysql/mysql_test.go +++ b/components/sequencer/mysql/mysql_test.go @@ -20,7 +20,6 @@ import ( "github.com/DATA-DOG/go-sqlmock" "github.com/stretchr/testify/assert" - "mosn.io/pkg/log" "mosn.io/layotto/components/sequencer" ) @@ -44,7 +43,7 @@ func TestMySQLSequencer_Init(t *testing.T) { t.Fatalf("an error '%s' was not expected when opening a stub database connection", err) } - comp := NewMySQLSequencer(log.DefaultLogger) + comp := NewMySQLSequencer() comp.db = db cfg := sequencer.Configuration{ @@ -67,7 +66,7 @@ func TestMySQLSequencer_Init(t *testing.T) { func TestMySQLSequencer_GetNextId(t *testing.T) { - comp := NewMySQLSequencer(log.DefaultLogger) + comp := NewMySQLSequencer() db, mock, err := sqlmock.New() if err != nil { @@ -103,7 +102,7 @@ func TestMySQLSequencer_GetNextId(t *testing.T) { func TestMySQLSequencer_GetSegment(t *testing.T) { - comp := NewMySQLSequencer(log.DefaultLogger) + comp := NewMySQLSequencer() db, mock, err := sqlmock.New() if err != nil { @@ -147,7 +146,7 @@ func TestMySQLSequencer_Close(t *testing.T) { t.Fatalf("an error '%s' was not expected when opening a stub database connection", err) } - comp := NewMySQLSequencer(log.DefaultLogger) + comp := NewMySQLSequencer() cfg := sequencer.Configuration{ BiggerThan: nil, @@ -163,7 +162,7 @@ func TestMySQLSequencer_Close(t *testing.T) { } func TestMySQLSequencer_Segment_Insert(t *testing.T) { - comp := NewMySQLSequencer(log.DefaultLogger) + comp := NewMySQLSequencer() db, mock, err := sqlmock.New() if err != nil { @@ -195,7 +194,7 @@ func TestMySQLSequencer_Segment_Insert(t *testing.T) { } func TestMySQLSequencer_GetNextId_Insert(t *testing.T) { - comp := NewMySQLSequencer(log.DefaultLogger) + comp := NewMySQLSequencer() db, mock, err := sqlmock.New() if err != nil { @@ -227,7 +226,7 @@ func TestMySQLSequencer_GetNextId_Insert(t *testing.T) { } func TestMySQLSequencer_GetNextId_InsertError(t *testing.T) { - comp := NewMySQLSequencer(log.DefaultLogger) + comp := NewMySQLSequencer() db, mock, err := sqlmock.New() if err != nil { @@ -253,7 +252,7 @@ func TestMySQLSequencer_GetNextId_InsertError(t *testing.T) { } func TestMySQLSequencer_Segment_InsertError(t *testing.T) { - comp := NewMySQLSequencer(log.DefaultLogger) + comp := NewMySQLSequencer() db, mock, err := sqlmock.New() if err != nil { @@ -282,7 +281,7 @@ func TestMySQLSequencer_Segment_InsertError(t *testing.T) { } func TestMySQLSequencer_GetNextId_UpdateError(t *testing.T) { - comp := NewMySQLSequencer(log.DefaultLogger) + comp := NewMySQLSequencer() db, mock, err := sqlmock.New() if err != nil { @@ -313,7 +312,7 @@ func TestMySQLSequencer_GetNextId_UpdateError(t *testing.T) { } func TestMySQLSequencer_Segment_UpdateError(t *testing.T) { - comp := NewMySQLSequencer(log.DefaultLogger) + comp := NewMySQLSequencer() db, mock, err := sqlmock.New() if err != nil { diff --git a/components/sequencer/redis/standalone_redis_sequencer.go b/components/sequencer/redis/standalone_redis_sequencer.go index 95282fd8ab..df95792430 100644 --- a/components/sequencer/redis/standalone_redis_sequencer.go +++ b/components/sequencer/redis/standalone_redis_sequencer.go @@ -17,7 +17,8 @@ import ( "sync" "github.com/go-redis/redis/v8" - "mosn.io/pkg/log" + + "mosn.io/layotto/kit/logger" "mosn.io/layotto/components/pkg/actuators" "mosn.io/layotto/components/pkg/utils" @@ -44,24 +45,29 @@ type StandaloneRedisSequencer struct { metadata utils.RedisMetadata biggerThan map[string]int64 - logger log.ErrorLogger + logger logger.Logger ctx context.Context cancel context.CancelFunc } // NewStandaloneRedisSequencer returns a new redis sequencer -func NewStandaloneRedisSequencer(logger log.ErrorLogger) *StandaloneRedisSequencer { +func NewStandaloneRedisSequencer() *StandaloneRedisSequencer { once.Do(func() { indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} actuators.SetComponentsIndicator(componentName, indicators) }) s := &StandaloneRedisSequencer{ - logger: logger, + logger: logger.NewLayottoLogger("sequencer/redis"), } + logger.RegisterComponentLoggerListener("sequencer/redis", s) return s } +func (s *StandaloneRedisSequencer) OnLogLevelChanged(level logger.LogLevel) { + s.logger.SetLogLevel(level) +} + /* 1. exists and >= biggerThan, no operation required, return 0 2. not exists or < biggthan, reset val, return 1 diff --git a/components/sequencer/redis/standalone_redis_sequencer_test.go b/components/sequencer/redis/standalone_redis_sequencer_test.go index 6ac44dec8c..142c710000 100644 --- a/components/sequencer/redis/standalone_redis_sequencer_test.go +++ b/components/sequencer/redis/standalone_redis_sequencer_test.go @@ -18,7 +18,6 @@ import ( "github.com/alicebob/miniredis/v2" "github.com/stretchr/testify/assert" - "mosn.io/pkg/log" "mosn.io/layotto/components/sequencer" ) @@ -30,7 +29,7 @@ func TestStandaloneRedisSequencer(t *testing.T) { assert.NoError(t, err) defer s.Close() // construct component - comp := NewStandaloneRedisSequencer(log.DefaultLogger) + comp := NewStandaloneRedisSequencer() cfg := sequencer.Configuration{ Properties: make(map[string]string), } @@ -59,7 +58,7 @@ func TestStandaloneRedisSequencer_biggerThan_success(t *testing.T) { assert.NoError(t, err) defer s.Close() // construct component - comp := NewStandaloneRedisSequencer(log.DefaultLogger) + comp := NewStandaloneRedisSequencer() cfg := sequencer.Configuration{ Properties: make(map[string]string), } @@ -95,7 +94,7 @@ func TestStandaloneRedisSequencer_biggerThan_fail_reset(t *testing.T) { assert.NoError(t, err) defer s.Close() // construct component - comp := NewStandaloneRedisSequencer(log.DefaultLogger) + comp := NewStandaloneRedisSequencer() cfg := sequencer.Configuration{ Properties: make(map[string]string), } @@ -125,7 +124,7 @@ func TestStandaloneRedisSequencer_segment(t *testing.T) { assert.NoError(t, err) defer s.Close() // construct component - comp := NewStandaloneRedisSequencer(log.DefaultLogger) + comp := NewStandaloneRedisSequencer() cfg := sequencer.Configuration{ Properties: make(map[string]string), } diff --git a/components/sequencer/snowflake/snowflake_sequencer.go b/components/sequencer/snowflake/snowflake_sequencer.go index 22019cadaf..9789651aec 100755 --- a/components/sequencer/snowflake/snowflake_sequencer.go +++ b/components/sequencer/snowflake/snowflake_sequencer.go @@ -20,7 +20,7 @@ import ( "sync" "time" - "mosn.io/pkg/log" + "mosn.io/layotto/kit/logger" "mosn.io/layotto/components/pkg/actuators" "mosn.io/layotto/components/sequencer" @@ -48,20 +48,26 @@ type SnowFlakeSequencer struct { mu sync.Mutex smap map[string]chan int64 biggerThan map[string]int64 - logger log.ErrorLogger + logger logger.Logger ctx context.Context cancel context.CancelFunc } -func NewSnowFlakeSequencer(logger log.ErrorLogger) *SnowFlakeSequencer { +func NewSnowFlakeSequencer() *SnowFlakeSequencer { once.Do(func() { indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} actuators.SetComponentsIndicator(componentName, indicators) }) - return &SnowFlakeSequencer{ - logger: logger, + sf := &SnowFlakeSequencer{ + logger: logger.NewLayottoLogger("sequencer/snowflake"), smap: make(map[string]chan int64), } + logger.RegisterComponentLoggerListener("sequencer/snowflake", sf) + return sf +} + +func (s *SnowFlakeSequencer) OnLogLevelChanged(level logger.LogLevel) { + s.logger.SetLogLevel(level) } func (s *SnowFlakeSequencer) Init(config sequencer.Configuration) error { @@ -139,7 +145,7 @@ func (s *SnowFlakeSequencer) GetSegment(req *sequencer.GetSegmentRequest) (suppo func (s *SnowFlakeSequencer) producer(id, currentTimeStamp int64, ch chan int64, key string) { defer func() { if x := recover(); x != nil { - log.DefaultLogger.Errorf("panic when producing id with snowflake algorithm: %v", x) + s.logger.Errorf("panic when producing id with snowflake algorithm: %v", x) } }() diff --git a/components/sequencer/snowflake/snowflake_sequencer_test.go b/components/sequencer/snowflake/snowflake_sequencer_test.go index 5b6b2e3dec..39271d4c6a 100755 --- a/components/sequencer/snowflake/snowflake_sequencer_test.go +++ b/components/sequencer/snowflake/snowflake_sequencer_test.go @@ -22,7 +22,6 @@ import ( "github.com/DATA-DOG/go-sqlmock" _ "github.com/go-sql-driver/mysql" "github.com/stretchr/testify/assert" - "mosn.io/pkg/log" "mosn.io/layotto/components/sequencer" ) @@ -41,7 +40,7 @@ func TestSnowflakeSequence_GetNextId(t *testing.T) { t.Fatalf("an error '%s' was not expected when opening a stub database connection", err) } - s := NewSnowFlakeSequencer(log.DefaultLogger) + s := NewSnowFlakeSequencer() s.db = db mock.ExpectExec("CREATE TABLE").WillReturnResult(sqlmock.NewResult(1, 1)) @@ -96,7 +95,7 @@ func TestSnowflakeSequence_ParallelGetNextId(t *testing.T) { t.Fatalf("an error '%s' was not expected when opening a stub database connection", err) } - s := NewSnowFlakeSequencer(log.DefaultLogger) + s := NewSnowFlakeSequencer() s.db = db mock.ExpectExec("CREATE TABLE").WillReturnResult(sqlmock.NewResult(1, 1)) @@ -135,7 +134,7 @@ func TestSnowflakeSequence_ParallelGetNextId(t *testing.T) { go func(key string) { defer func() { if x := recover(); x != nil { - log.DefaultLogger.Errorf("panic when testing parallel generatoring uid with snowflake algorithm: %v", x) + s.logger.Errorf("panic when testing parallel generatoring uid with snowflake algorithm: %v", x) } }() var preUid int64 @@ -162,7 +161,7 @@ func TestKeyTimeout(t *testing.T) { t.Fatalf("an error '%s' was not expected when opening a stub database connection", err) } - s := NewSnowFlakeSequencer(log.DefaultLogger) + s := NewSnowFlakeSequencer() s.db = db mock.ExpectExec("CREATE TABLE").WillReturnResult(sqlmock.NewResult(1, 1)) diff --git a/components/sequencer/zookeeper/zookeeper_sequencer.go b/components/sequencer/zookeeper/zookeeper_sequencer.go index a69f21f22c..a9ad7cf500 100644 --- a/components/sequencer/zookeeper/zookeeper_sequencer.go +++ b/components/sequencer/zookeeper/zookeeper_sequencer.go @@ -19,7 +19,8 @@ import ( "sync" "github.com/go-zookeeper/zk" - "mosn.io/pkg/log" + + "mosn.io/layotto/kit/logger" "mosn.io/layotto/components/pkg/actuators" "mosn.io/layotto/components/pkg/utils" @@ -46,25 +47,30 @@ type ZookeeperSequencer struct { client utils.ZKConnection metadata utils.ZookeeperMetadata BiggerThan map[string]int64 - logger log.ErrorLogger + logger logger.Logger factory utils.ConnectionFactory ctx context.Context cancel context.CancelFunc } // NewZookeeperSequencer returns a new zookeeper sequencer -func NewZookeeperSequencer(logger log.ErrorLogger) *ZookeeperSequencer { +func NewZookeeperSequencer() *ZookeeperSequencer { once.Do(func() { indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} actuators.SetComponentsIndicator(componentName, indicators) }) s := &ZookeeperSequencer{ - logger: logger, + logger: logger.NewLayottoLogger("sequencer/zookeeper"), } + logger.RegisterComponentLoggerListener("sequencer/zookeeper", s) return s } +func (s *ZookeeperSequencer) OnLogLevelChanged(level logger.LogLevel) { + s.logger.SetLogLevel(level) +} + func (s *ZookeeperSequencer) Init(config sequencer.Configuration) error { m, err := utils.ParseZookeeperMetadata(config.Properties) if err != nil { diff --git a/components/sequencer/zookeeper/zookeeper_sequencer_test.go b/components/sequencer/zookeeper/zookeeper_sequencer_test.go index fab6b71e3c..c464fe58d8 100644 --- a/components/sequencer/zookeeper/zookeeper_sequencer_test.go +++ b/components/sequencer/zookeeper/zookeeper_sequencer_test.go @@ -18,7 +18,6 @@ import ( "github.com/go-zookeeper/zk" "github.com/golang/mock/gomock" "github.com/stretchr/testify/assert" - "mosn.io/pkg/log" "mosn.io/layotto/components/pkg/mock" "mosn.io/layotto/components/sequencer" @@ -34,7 +33,7 @@ func TestZookeeperSequencer_GetNextId(t *testing.T) { }, } - comp := NewZookeeperSequencer(log.DefaultLogger) + comp := NewZookeeperSequencer() comp.Init(cfg) //mock diff --git a/go.mod b/go.mod index 82781dfbda..9777ad8394 100644 --- a/go.mod +++ b/go.mod @@ -25,7 +25,7 @@ require ( github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 github.com/pkg/errors v0.9.1 github.com/shirou/gopsutil v3.21.3+incompatible - github.com/sirupsen/logrus v1.8.1 + github.com/sirupsen/logrus v1.9.3 github.com/stretchr/testify v1.8.0 github.com/uber/jaeger-client-go v2.25.0+incompatible github.com/urfave/cli v1.22.1 @@ -38,6 +38,7 @@ require ( k8s.io/apimachinery v0.20.2 mosn.io/api v1.5.0 mosn.io/layotto/components v0.0.0-20230712052228-c940b7f1367d + mosn.io/layotto/kit v0.0.0-00010101000000-000000000000 mosn.io/layotto/spec v0.0.0-20231023045845-48ec2bc7eab8 mosn.io/mosn v1.5.1-0.20230529091910-7d48a20e544b mosn.io/pkg v1.5.1-0.20230525074748-e3528eae50d9 @@ -327,6 +328,7 @@ replace ( github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.7.0 github.com/klauspost/compress => github.com/klauspost/compress v1.13.0 mosn.io/layotto/components => ./components + mosn.io/layotto/kit => ./kit mosn.io/layotto/spec => ./spec mosn.io/proxy-wasm-go-host => github.com/layotto/proxy-wasm-go-host v0.1.1-0.20221229094558-d39f73d2858d ) diff --git a/go.sum b/go.sum index 2a0889b591..819e0b40a7 100644 --- a/go.sum +++ b/go.sum @@ -107,8 +107,8 @@ github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZ github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= @@ -1225,8 +1225,9 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.1.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= @@ -1703,6 +1704,7 @@ golang.org/x/sys v0.0.0-20211020174200-9d6173849985/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= diff --git a/kit/go.mod b/kit/go.mod new file mode 100644 index 0000000000..dd655f6af8 --- /dev/null +++ b/kit/go.mod @@ -0,0 +1,15 @@ +module mosn.io/layotto/kit + +go 1.18 + +require mosn.io/pkg v1.3.0 + +require ( + github.com/BurntSushi/toml v1.4.0 // indirect + github.com/golang/protobuf v1.5.0 // indirect + github.com/hashicorp/go-syslog v1.0.0 // indirect + github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 // indirect + google.golang.org/protobuf v1.26.0-rc.1 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect + mosn.io/api v1.3.0 // indirect +) diff --git a/kit/go.sum b/kit/go.sum new file mode 100644 index 0000000000..5977e67c1d --- /dev/null +++ b/kit/go.sum @@ -0,0 +1,25 @@ +github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= +github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/golang/protobuf v1.5.0 h1:LUVKkCeviFUMKqHa4tXIIij/lbhnMbP7Fn5wKdKkRh4= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/hashicorp/go-syslog v1.0.0 h1:KaodqZuhUoZereWVIYmpUgZysurB1kBLX2j0MwMrUAE= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 h1:MkV+77GLUNo5oJ0jf870itWm3D0Sjh7+Za9gazKc5LQ= +github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/protobuf v1.26.0-rc.1 h1:7QnIQpGRHE5RnLKnESfDoxm2dTapTZua5a0kS0A+VXQ= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +mosn.io/api v1.3.0 h1:QhsrbkvYnpvvrC151S0N09TdU2jDODygLVK3Y58ubgg= +mosn.io/api v1.3.0/go.mod h1:mJX2oRJkrXjLN6hY1Wwrlxj0F+RqEPOMhbf2WhZO+VY= +mosn.io/pkg v1.3.0 h1:Oa6pwc7E98+reCrtMZD4psXekbMYrD8jM4woo2iahOI= +mosn.io/pkg v1.3.0/go.mod h1:bksEtkXis6vzQoU9Q7wwY9bWt7gfrj/l7rjRDu21Vt4= diff --git a/kit/logger/logger.go b/kit/logger/logger.go new file mode 100644 index 0000000000..a97832bb21 --- /dev/null +++ b/kit/logger/logger.go @@ -0,0 +1,331 @@ +/* + * Copyright 2021 Layotto Authors + * + * Licensed 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 ( + "fmt" + "strings" + "sync" + + "mosn.io/pkg/log" +) + +const ( + // TraceLevel is for logging verbose message with a set of methods and properties to help track code execution. + TraceLevel LogLevel = "trace" + // DebugLevel has verbose message. + DebugLevel LogLevel = "debug" + // InfoLevel is default log level. + InfoLevel LogLevel = "info" + // WarnLevel is for logging messages about possible issues. + WarnLevel LogLevel = "warn" + // ErrorLevel is for logging errors. + ErrorLevel LogLevel = "error" + // FatalLevel is for logging fatal messages. + FatalLevel LogLevel = "fatal" + + // UndefinedLevel is for undefined log level. + UndefinedLevel LogLevel = "undefined" + + logKeyDebug = "debug" + logKeyAccess = "access" + logKeyError = "error" + fileNameDebug = "layotto.debug.log" + fileNameAccess = "layotto.access.log" + fileNameError = "layotto.error.log" +) + +var ( + loggerListeners sync.Map + defaultLoggerLevel = InfoLevel + defaultLogFilePath = "./" +) + +// LogLevel is Logger Level type. +type LogLevel string + +// ComponentLoggerListener is the interface for setting log config. +type ComponentLoggerListener interface { + OnLogLevelChanged(outputLevel LogLevel) +} + +// RegisterComponentLoggerListener registers a logger for a component logger listener. +func RegisterComponentLoggerListener(componentName string, logger ComponentLoggerListener) { + loggerListeners.Store(componentName, logger) +} + +// SetComponentLoggerLevel sets the log level for a component. +func SetComponentLoggerLevel(componentName string, level string) { + logLevel := toLogLevel(level) + logger, ok := loggerListeners.Load(componentName) + if !ok { + log.DefaultLogger.Warnf("component logger for %s not found", componentName) + } else { + componentLoggerListener, ok := logger.(ComponentLoggerListener) + if !ok { + log.DefaultLogger.Warnf("component logger for %s is not ComponentLoggerListener", componentName) + } else { + componentLoggerListener.OnLogLevelChanged(logLevel) + } + } +} + +// SetDefaultLoggerLevel sets the default log output level. +func SetDefaultLoggerLevel(level string) { + if level != "" { + defaultLoggerLevel = toLogLevel(level) + } +} + +// SetDefaultLoggerFilePath sets the default log file path. +func SetDefaultLoggerFilePath(filePath string) { + defaultLogFilePath = filePath +} + +// layottoLogger is the implementation for layotto. +type layottoLogger struct { + // name is the name of logger that is published to log as a component. + name string + + logLevel LogLevel + + loggers map[string]log.ErrorLogger +} + +// Logger api for logging. +type Logger interface { + // Trace logs a message at level Trace. + Trace(args ...interface{}) + // Tracef logs a message at level Trace. + Tracef(format string, args ...interface{}) + // Debug logs a message at level Debug. + Debug(args ...interface{}) + // Debugf logs a message at level Debug. + Debugf(format string, args ...interface{}) + // Info logs a message at level Info. + Info(args ...interface{}) + // Infof logs a message at level Info. + Infof(format string, args ...interface{}) + // Warn logs a message at level Warn. + Warn(args ...interface{}) + // Warnf logs a message at level Warn. + Warnf(format string, args ...interface{}) + // Error logs a message at level Error. + Error(args ...interface{}) + // Errorf logs a message at level Error. + Errorf(format string, args ...interface{}) + // Fatal logs a message at level Fatal. + Fatal(args ...interface{}) + // Fatalf logs a message at level Fatal. + Fatalf(format string, args ...interface{}) + // SetLogLevel sets the log output level + SetLogLevel(outputLevel LogLevel) + // GetLogLevel get the log output level + GetLogLevel() LogLevel +} + +// toLogLevel converts to LogLevel. +func toLogLevel(level string) LogLevel { + switch strings.ToLower(level) { + case "trace": + return TraceLevel + case "debug": + return DebugLevel + case "info": + return InfoLevel + case "warn": + return WarnLevel + case "error": + return ErrorLevel + case "fatal": + return FatalLevel + } + // unsupported log level + return UndefinedLevel +} + +// ToLogPriority converts to Logger priority. +func ToLogPriority(level LogLevel) int { + switch level { + case TraceLevel: + return 1 + case DebugLevel: + return 2 + case InfoLevel: + return 3 + case WarnLevel: + return 4 + case ErrorLevel: + return 5 + case FatalLevel: + return 6 + } + return 0 +} + +// NewLayottoLogger creates new Logger instance. +func NewLayottoLogger(name string) Logger { + ll := &layottoLogger{ + name: name, + logLevel: defaultLoggerLevel, + loggers: make(map[string]log.ErrorLogger), + } + + dMosnLogger, err := log.GetOrCreateLogger(defaultLogFilePath+fileNameDebug, nil) + + dLogger := &log.SimpleErrorLog{ + Logger: dMosnLogger, + Level: log.DEBUG, + } + if err != nil { + ll.loggers[logKeyDebug] = log.DefaultLogger + log.DefaultLogger.Errorf("Failed to create mosn logger: %v", err) + } else { + dLogger.SetLogLevel(toMosnLoggerLevel(defaultLoggerLevel)) + ll.loggers[logKeyDebug] = dLogger + } + + aMosnLogger, err := log.GetOrCreateLogger(defaultLogFilePath+fileNameAccess, nil) + + aLogger := &log.SimpleErrorLog{ + Logger: aMosnLogger, + Level: log.INFO, + } + if err != nil { + ll.loggers[logKeyAccess] = log.DefaultLogger + log.DefaultLogger.Errorf("Failed to create mosn logger: %v", err) + } else { + aLogger.SetLogLevel(toMosnLoggerLevel(defaultLoggerLevel)) + ll.loggers[logKeyAccess] = aLogger + } + + eMosnLogger, err := log.GetOrCreateLogger(defaultLogFilePath+fileNameError, nil) + + eLogger := &log.SimpleErrorLog{ + Logger: eMosnLogger, + Level: log.ERROR, + } + if err != nil { + ll.loggers[logKeyError] = log.DefaultLogger + log.DefaultLogger.Errorf("Failed to create mosn logger: %v", err) + } else { + eLogger.SetLogLevel(toMosnLoggerLevel(defaultLoggerLevel)) + ll.loggers[logKeyError] = eLogger + } + return ll +} + +// Tracef logs a message at level Trace. +func (l *layottoLogger) Tracef(format string, args ...interface{}) { + l.loggers[logKeyDebug].Tracef("[%s] %s", l.name, fmt.Sprintf(format, args...)) +} + +// Trace logs a message at level Trace. +func (l *layottoLogger) Trace(args ...interface{}) { + l.loggers[logKeyDebug].Tracef("%s", args...) +} + +// Debugf logs a message at level Debug. +func (l *layottoLogger) Debugf(format string, args ...interface{}) { + l.loggers[logKeyDebug].Debugf("[%s] %s", l.name, fmt.Sprintf(format, args...)) +} + +// Debug logs a message at level Debug. +func (l *layottoLogger) Debug(args ...interface{}) { + l.loggers[logKeyDebug].Debugf("%s", args...) +} + +// Infof logs a message at level Info. +func (l *layottoLogger) Infof(format string, args ...interface{}) { + l.loggers[logKeyAccess].Infof("[%s] %s", l.name, fmt.Sprintf(format, args...)) +} + +// Info logs a message at level Info. +func (l *layottoLogger) Info(args ...interface{}) { + l.loggers[logKeyAccess].Infof("%s", args...) +} + +// Warnf logs a message at level Warn. +func (l *layottoLogger) Warnf(format string, args ...interface{}) { + l.loggers[logKeyAccess].Warnf("[%s] %s", l.name, fmt.Sprintf(format, args...)) +} + +// Warn logs a message at level Warn. +func (l *layottoLogger) Warn(args ...interface{}) { + l.loggers[logKeyAccess].Warnf("%s", args...) +} + +// Errorf logs a message at level Error. +func (l *layottoLogger) Errorf(format string, args ...interface{}) { + l.loggers[logKeyError].Errorf("[%s] %s", l.name, fmt.Sprintf(format, args...)) +} + +// Error logs a message at level Error. +func (l *layottoLogger) Error(args ...interface{}) { + l.loggers[logKeyError].Errorf("%s", args...) +} + +// Fatalf logs a message at level Fatal. +func (l *layottoLogger) Fatalf(format string, args ...interface{}) { + l.loggers[logKeyError].Fatalf("[%s] %s", l.name, fmt.Sprintf(format, args...)) +} + +// Fatal logs a message at level Fatal. +func (l *layottoLogger) Fatal(args ...interface{}) { + l.loggers[logKeyError].Fatalf("%s", args...) +} + +// GetLogLevel gets the log output level. +func (l *layottoLogger) GetLogLevel() LogLevel { + return l.logLevel +} + +// toMosnLoggerLevel converts to logrus.Level. +func toMosnLoggerLevel(lvl LogLevel) log.Level { + // ignore error because it will never happen + l, _ := parseLevel(string(lvl)) + return l +} + +// parseLevel takes a string level and returns the Mosn logger level constant. +func parseLevel(lvl string) (log.Level, error) { + switch strings.ToLower(lvl) { + case "fatal": + return log.FATAL, nil + case "error": + return log.ERROR, nil + case "warn", "warning": + return log.WARN, nil + case "info": + return log.INFO, nil + case "debug": + return log.DEBUG, nil + case "trace": + return log.TRACE, nil + } + + var l log.Level + return l, fmt.Errorf("not a valid mosn Level: %q", lvl) +} + +// SetLogLevel sets log output level. +func (l *layottoLogger) SetLogLevel(outputLevel LogLevel) { + l.logLevel = outputLevel + l.loggers[logKeyDebug].SetLogLevel(toMosnLoggerLevel(outputLevel)) + l.loggers[logKeyAccess].SetLogLevel(toMosnLoggerLevel(outputLevel)) + l.loggers[logKeyError].SetLogLevel(toMosnLoggerLevel(outputLevel)) +} diff --git a/pkg/actuator/logger/endpoint.go b/pkg/actuator/logger/endpoint.go new file mode 100644 index 0000000000..11b58a43e5 --- /dev/null +++ b/pkg/actuator/logger/endpoint.go @@ -0,0 +1,62 @@ +/* + * Copyright 2021 Layotto Authors + * + * Licensed 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 info + +import ( + "context" + "encoding/json" + "errors" + + log "mosn.io/layotto/kit/logger" + "mosn.io/layotto/pkg/actuator" + "mosn.io/layotto/pkg/filter/stream/common/http" +) + +// init info Endpoint. +func init() { + actuator.GetDefault().AddEndpoint("logger", NewEndpoint()) +} + +type Endpoint struct { +} + +type LoggerLevelChangedRequest struct { + Component string `json:"component"` + Level string `json:"level"` +} + +func NewEndpoint() *Endpoint { + return &Endpoint{} +} + +func (e *Endpoint) Handle(ctx context.Context, params http.ParamsScanner) (map[string]interface{}, error) { + result := make(map[string]interface{}) + + requestData := ctx.Value(http.ContextKeyRequestData{}) + if requestData == nil { + return nil, errors.New("invalid request body") + } + var request LoggerLevelChangedRequest + err := json.Unmarshal(requestData.([]byte), &request) + if err != nil { + return nil, err + } + log.SetComponentLoggerLevel(request.Component, request.Level) + var resultErr error + // handle the infoContributors + return result, resultErr +} diff --git a/pkg/runtime/runtime_test.go b/pkg/runtime/runtime_test.go index 22aef86d3a..d89e17c4a0 100644 --- a/pkg/runtime/runtime_test.go +++ b/pkg/runtime/runtime_test.go @@ -257,13 +257,13 @@ func TestMosnRuntime_Run(t *testing.T) { // Sequencer WithSequencerFactory( runtime_sequencer.NewFactory("etcd", func() sequencer.Store { - return sequencer_etcd.NewEtcdSequencer(log.DefaultLogger) + return sequencer_etcd.NewEtcdSequencer() }), runtime_sequencer.NewFactory("redis", func() sequencer.Store { - return sequencer_redis.NewStandaloneRedisSequencer(log.DefaultLogger) + return sequencer_redis.NewStandaloneRedisSequencer() }), runtime_sequencer.NewFactory("zookeeper", func() sequencer.Store { - return sequencer_zookeeper.NewZookeeperSequencer(log.DefaultLogger) + return sequencer_zookeeper.NewZookeeperSequencer() }), ), ) @@ -648,13 +648,13 @@ func TestMosnRuntime_runWithCustomComponentAndAPI(t *testing.T) { // Sequencer WithSequencerFactory( runtime_sequencer.NewFactory(compType, func() sequencer.Store { - return sequencer_etcd.NewEtcdSequencer(log.DefaultLogger) + return sequencer_etcd.NewEtcdSequencer() }), runtime_sequencer.NewFactory("redis", func() sequencer.Store { - return sequencer_redis.NewStandaloneRedisSequencer(log.DefaultLogger) + return sequencer_redis.NewStandaloneRedisSequencer() }), runtime_sequencer.NewFactory("zookeeper", func() sequencer.Store { - return sequencer_zookeeper.NewZookeeperSequencer(log.DefaultLogger) + return sequencer_zookeeper.NewZookeeperSequencer() }), ), ) @@ -702,13 +702,13 @@ func TestMosnRuntime_runWithPubsub(t *testing.T) { // Sequencer WithSequencerFactory( runtime_sequencer.NewFactory("etcd", func() sequencer.Store { - return sequencer_etcd.NewEtcdSequencer(log.DefaultLogger) + return sequencer_etcd.NewEtcdSequencer() }), runtime_sequencer.NewFactory("redis", func() sequencer.Store { - return sequencer_redis.NewStandaloneRedisSequencer(log.DefaultLogger) + return sequencer_redis.NewStandaloneRedisSequencer() }), runtime_sequencer.NewFactory("zookeeper", func() sequencer.Store { - return sequencer_zookeeper.NewZookeeperSequencer(log.DefaultLogger) + return sequencer_zookeeper.NewZookeeperSequencer() }), ), ) diff --git a/pkg/runtime/sequencer/cache_test.go b/pkg/runtime/sequencer/cache_test.go index 975c9f98e9..2eb13457a7 100644 --- a/pkg/runtime/sequencer/cache_test.go +++ b/pkg/runtime/sequencer/cache_test.go @@ -18,7 +18,6 @@ import ( "github.com/alicebob/miniredis/v2" "github.com/stretchr/testify/assert" - "mosn.io/pkg/log" "mosn.io/layotto/components/sequencer" "mosn.io/layotto/components/sequencer/redis" @@ -32,7 +31,7 @@ func TestGetNextIdFromCache(t *testing.T) { assert.NoError(t, err) defer s.Close() // construct componen - comp := redis.NewStandaloneRedisSequencer(log.DefaultLogger) + comp := redis.NewStandaloneRedisSequencer() cfg := sequencer.Configuration{ Properties: make(map[string]string), } diff --git a/pkg/wasm/install/endpoint.go b/pkg/wasm/install/endpoint.go index 8ca725d284..586edae5e4 100644 --- a/pkg/wasm/install/endpoint.go +++ b/pkg/wasm/install/endpoint.go @@ -22,33 +22,37 @@ import ( wasm2 "mosn.io/mosn/pkg/wasm" - "mosn.io/pkg/log" + "mosn.io/layotto/kit/logger" "mosn.io/layotto/pkg/filter/stream/common/http" "mosn.io/layotto/pkg/wasm" ) func init() { - wasm.GetDefault().AddEndpoint("install", NewEndpoint()) + w := wasm.GetDefault() + w.AddEndpoint("install", NewEndpoint(w.Logger)) } type Endpoint struct { + logger logger.Logger } -func NewEndpoint() *Endpoint { - return &Endpoint{} +func NewEndpoint(log logger.Logger) *Endpoint { + return &Endpoint{ + logger: log, + } } func (e *Endpoint) Handle(ctx context.Context, params http.ParamsScanner) (map[string]interface{}, error) { conf, err := http.GetRequestData(ctx) if err != nil { - log.DefaultLogger.Errorf("[wasm][install] invalid request body for request /wasm/install, err:%v", err) + e.logger.Errorf("[wasm][install] invalid request body for request /wasm/install, err:%v", err) return map[string]interface{}{"error": err.Error()}, err } if conf["name"] == nil { errorMessage := "can't get name property" - log.DefaultLogger.Errorf("[wasm][install] %v", errorMessage) + e.logger.Errorf("[wasm][install] %v", errorMessage) return map[string]interface{}{"error": errorMessage}, errors.New(errorMessage) } @@ -56,14 +60,14 @@ func (e *Endpoint) Handle(ctx context.Context, params http.ParamsScanner) (map[s factory := wasm.GetFactory() if factory.IsRegister(id) { errorMessage := id + " is already registered" - log.DefaultLogger.Errorf("[wasm][install] %v", errorMessage) + e.logger.Errorf("[wasm][install] %v", errorMessage) return map[string]interface{}{"error": errorMessage}, errors.New(errorMessage) } manager := wasm2.GetWasmManager() err = factory.Install(conf, manager) if err != nil { - log.DefaultLogger.Errorf("[wasm][install] %v", err) + e.logger.Errorf("[wasm][install] %v", err) return map[string]interface{}{"error": err.Error()}, err } diff --git a/pkg/wasm/install/init.go b/pkg/wasm/install/init.go index 49aa94f43f..42caa18a2d 100644 --- a/pkg/wasm/install/init.go +++ b/pkg/wasm/install/init.go @@ -24,5 +24,6 @@ import ( ) func init() { - wasm.GetDefault().AddEndpoint("install", NewEndpoint()) + w := wasm.GetDefault() + w.AddEndpoint("install", NewEndpoint(w.Logger)) } diff --git a/pkg/wasm/uninstall/endpoint.go b/pkg/wasm/uninstall/endpoint.go index 358f376033..4d55d87ca0 100644 --- a/pkg/wasm/uninstall/endpoint.go +++ b/pkg/wasm/uninstall/endpoint.go @@ -25,37 +25,41 @@ import ( wasm2 "mosn.io/mosn/pkg/wasm" - "mosn.io/pkg/log" + "mosn.io/layotto/kit/logger" ) func init() { - wasm.GetDefault().AddEndpoint("uninstall", NewEndpoint()) + w := wasm.GetDefault() + w.AddEndpoint("uninstall", NewEndpoint(w.Logger)) } type Endpoint struct { + logger logger.Logger } -func NewEndpoint() *Endpoint { - return &Endpoint{} +func NewEndpoint(logger logger.Logger) *Endpoint { + return &Endpoint{ + logger: logger, + } } func (e *Endpoint) Handle(ctx context.Context, params http.ParamsScanner) (map[string]interface{}, error) { conf, err := http.GetRequestData(ctx) if err != nil { - log.DefaultLogger.Errorf("[wasm][uninstall] invalid request body for request /wasm/uninstall, err:%v", err) + e.logger.Errorf("[wasm][uninstall] invalid request body for request /wasm/uninstall, err:%v", err) return map[string]interface{}{"error": err.Error()}, err } if conf["name"] == nil { errorMessage := "can't get name property" - log.DefaultLogger.Errorf("[wasm][uninstall] %v", errorMessage) + e.logger.Errorf("[wasm][uninstall] %v", errorMessage) return map[string]interface{}{"error": errorMessage}, errors.New(errorMessage) } factory := wasm.GetFactory() err = factory.UnInstall(conf["name"].(string), wasm2.GetWasmManager()) if err != nil { - log.DefaultLogger.Errorf("[wasm][uninstall] %v", err) + e.logger.Errorf("[wasm][uninstall] %v", err) return map[string]interface{}{"error": err.Error()}, err } return nil, nil diff --git a/pkg/wasm/uninstall/init.go b/pkg/wasm/uninstall/init.go index 0b57a59f49..022ced373e 100644 --- a/pkg/wasm/uninstall/init.go +++ b/pkg/wasm/uninstall/init.go @@ -24,5 +24,6 @@ import ( ) func init() { - wasm.GetDefault().AddEndpoint("uninstall", NewEndpoint()) + w := wasm.GetDefault() + w.AddEndpoint("uninstall", NewEndpoint(w.Logger)) } diff --git a/pkg/wasm/update/endpoint.go b/pkg/wasm/update/endpoint.go index b3fcf412ee..852d8946d8 100644 --- a/pkg/wasm/update/endpoint.go +++ b/pkg/wasm/update/endpoint.go @@ -25,43 +25,47 @@ import ( wasm2 "mosn.io/mosn/pkg/wasm" - "mosn.io/pkg/log" + "mosn.io/layotto/kit/logger" ) func init() { - wasm.GetDefault().AddEndpoint("update", NewEndpoint()) + w := wasm.GetDefault() + w.AddEndpoint("update", NewEndpoint(w.Logger)) } type Endpoint struct { + logger logger.Logger } -func NewEndpoint() *Endpoint { - return &Endpoint{} +func NewEndpoint(logger logger.Logger) *Endpoint { + return &Endpoint{ + logger: logger, + } } func (e *Endpoint) Handle(ctx context.Context, params http.ParamsScanner) (map[string]interface{}, error) { conf, err := http.GetRequestData(ctx) if err != nil { - log.DefaultLogger.Errorf("[wasm][update] invalid request body for request /wasm/update, err:%v", err) + e.logger.Errorf("[wasm][update] invalid request body for request /wasm/update, err:%v", err) return map[string]interface{}{"error": err.Error()}, err } if conf["name"] == nil { errorMessage := "can't get name property" - log.DefaultLogger.Errorf("[wasm][update] %v", errorMessage) + e.logger.Errorf("[wasm][update] %v", errorMessage) return map[string]interface{}{"error": errorMessage}, errors.New(errorMessage) } if conf["instance_num"] == nil { errorMessage := "can't get instance_num property" - log.DefaultLogger.Errorf("[wasm][update] %v", errorMessage) + e.logger.Errorf("[wasm][update] %v", errorMessage) return map[string]interface{}{"error": errorMessage}, errors.New(errorMessage) } instanceNum := int(conf["instance_num"].(float64)) if instanceNum <= 0 { errorMessage := "instance_num should be greater than 0" - log.DefaultLogger.Errorf("[wasm][update] %v", errorMessage) + e.logger.Errorf("[wasm][update] %v", errorMessage) return map[string]interface{}{"error": errorMessage}, errors.New(errorMessage) } @@ -69,9 +73,9 @@ func (e *Endpoint) Handle(ctx context.Context, params http.ParamsScanner) (map[s factory := wasm.GetFactory() err = factory.UpdateInstanceNum(id, instanceNum, wasm2.GetWasmManager()) if err != nil { - log.DefaultLogger.Errorf("[wasm][update] %v", err) + e.logger.Errorf("[wasm][update] %v", err) return map[string]interface{}{"error": err.Error()}, err } - log.DefaultLogger.Infof("[wasm] [update] wasm instance number updated success, id: %v, num: %v", id, instanceNum) + e.logger.Infof("[wasm] [update] wasm instance number updated success, id: %v, num: %v", id, instanceNum) return nil, nil } diff --git a/pkg/wasm/update/init.go b/pkg/wasm/update/init.go index 85bbddbbc1..bed4d2b109 100644 --- a/pkg/wasm/update/init.go +++ b/pkg/wasm/update/init.go @@ -24,5 +24,6 @@ import ( ) func init() { - wasm.GetDefault().AddEndpoint("update", NewEndpoint()) + w := wasm.GetDefault() + w.AddEndpoint("update", NewEndpoint(w.Logger)) } diff --git a/pkg/wasm/wasm.go b/pkg/wasm/wasm.go index 2b0b4038c3..42ecfdf2e3 100644 --- a/pkg/wasm/wasm.go +++ b/pkg/wasm/wasm.go @@ -19,18 +19,26 @@ package wasm import ( "mosn.io/layotto/pkg/filter/stream/common/http" - "mosn.io/pkg/log" + "mosn.io/layotto/kit/logger" ) type Wasm struct { endpointRegistry map[string]http.Endpoint + Logger logger.Logger } // New init a Wasm. func New() *Wasm { - return &Wasm{ + wasm := &Wasm{ endpointRegistry: make(map[string]http.Endpoint), + Logger: logger.NewLayottoLogger("wasm"), } + logger.RegisterComponentLoggerListener("wasm", wasm) + return wasm +} + +func (wasm *Wasm) OnLogLevelChanged(outputLevel logger.LogLevel) { + wasm.Logger.SetLogLevel(outputLevel) } // GetEndpoint get an Endpoint from Wasm with name. @@ -43,7 +51,7 @@ func (wasm *Wasm) GetEndpoint(name string) (endpoint http.Endpoint, ok bool) { func (wasm *Wasm) AddEndpoint(name string, ep http.Endpoint) { _, ok := wasm.endpointRegistry[name] if ok { - log.DefaultLogger.Warnf("Duplicate Endpoint name: %v !", name) + wasm.Logger.Warnf("Duplicate Endpoint name: %v !", name) } wasm.endpointRegistry[name] = ep }