diff --git a/go.mod b/go.mod index da0c75a3..1bff2f89 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,7 @@ require ( go.opentelemetry.io/otel/sdk/metric v1.26.0 go.uber.org/goleak v1.3.0 go.uber.org/multierr v1.11.0 - go.uber.org/zap v1.26.0 + go.uber.org/zap v1.27.0 gopkg.in/yaml.v3 v3.0.1 ) diff --git a/go.sum b/go.sum index f4f03886..07461e51 100644 --- a/go.sum +++ b/go.sum @@ -217,6 +217,8 @@ go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= diff --git a/main.go b/main.go index a6d84381..bbac4979 100644 --- a/main.go +++ b/main.go @@ -4,8 +4,20 @@ import ( "log" "github.com/EinStack/glide/pkg/cmd" + "github.com/EinStack/glide/pkg/telemetry" + "go.uber.org/zap" ) +func init() { + config := telemetry.DefaultLogConfig() + config.Level = zap.DebugLevel + config.Encoding = "console" + err := telemetry.InitializeGlobalLogger(config) + if err != nil { + log.Fatalf("Failed to initialize logger: %v", err) + } +} + // @title Glide // @version 0.0.1 // @description API documentation for Glide, an open-source lightweight high-performance model gateway @@ -24,9 +36,10 @@ import ( // @BasePath / // @schemes http func main() { + logger := telemetry.GetLogger() cli := cmd.NewCLI() if err := cli.Execute(); err != nil { - log.Fatalf("💥Glide has finished with error: %v", err) + logger.Fatal("💥Glide has finished with error", zap.Error(err)) } } diff --git a/pkg/cmd/cli.go b/pkg/cmd/cli.go index af71d0d2..826f0fb5 100644 --- a/pkg/cmd/cli.go +++ b/pkg/cmd/cli.go @@ -1,9 +1,9 @@ package cmd import ( - "log" - + "github.com/EinStack/glide/pkg/telemetry" "github.com/EinStack/glide/pkg/version" + "go.uber.org/zap" "github.com/EinStack/glide/pkg/config" @@ -15,6 +15,7 @@ import ( var ( dotEnvFile string cfgFile string + logger = telemetry.GetLogger() ) const Description = ` @@ -49,9 +50,9 @@ func NewCLI() *cobra.Command { err := configProvider.LoadDotEnv(dotEnvFile) if err != nil { - log.Println("⚠️failed to load dotenv file: ", err) // don't have an inited logger at this moment + logger.Warn("⚠️failed to load dotenv file: ", zap.Error(err)) // don't have an inited logger at this moment } else { - log.Printf("🔧dot env file is loaded (%v)", dotEnvFile) + logger.Info("🔧dot env file is loaded", zap.Any("dotenv", dotEnvFile)) } _, err = configProvider.Load(cfgFile) diff --git a/pkg/telemetry/logging.go b/pkg/telemetry/logging.go index c4aa5ffe..e58414dc 100644 --- a/pkg/telemetry/logging.go +++ b/pkg/telemetry/logging.go @@ -1,6 +1,8 @@ package telemetry import ( + "sync" + "go.uber.org/zap" "go.uber.org/zap/zapcore" ) @@ -70,3 +72,38 @@ func NewLogger(cfg *LogConfig) (*zap.Logger, error) { return logger, nil } + +var ( + globalLogger *zap.Logger + loggerMutex sync.Mutex +) + +// To initialize & check looger only once +func InitializeGlobalLogger(cfg *LogConfig) error { + loggerMutex.Lock() + defer loggerMutex.Unlock() + + if globalLogger != nil { + return nil + } + + logger, err := NewLogger(cfg) + if err != nil { + return err + } + + globalLogger = logger + return nil +} + +func GetLogger() *zap.Logger { + loggerMutex.Lock() + defer loggerMutex.Unlock() + + if globalLogger == nil { + cfg := DefaultLogConfig() + globalLogger, _ = NewLogger(cfg) + } + + return globalLogger +}