github.com/verrazzano/verrazzano-monitoring-operator@v0.0.30/pkg/util/logs/loginit.go (about) 1 // Copyright (C) 2022, Oracle and/or its affiliates. 2 // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. 3 4 package logs 5 6 import ( 7 "go.uber.org/zap" 8 "go.uber.org/zap/zapcore" 9 ctrl "sigs.k8s.io/controller-runtime/pkg/log" 10 kzap "sigs.k8s.io/controller-runtime/pkg/log/zap" 11 ) 12 13 const ( 14 timeFormat = "2006-01-02T15:04:05.000Z" 15 timeKey = "@timestamp" 16 messageKey = "message" 17 callerKey = "caller" 18 ) 19 20 // InitLogs initializes logs with Time and Global Level of Logs set at Info 21 func InitLogs(opts kzap.Options) { 22 var config zap.Config 23 if opts.Development { 24 config = zap.NewDevelopmentConfig() 25 } else { 26 config = zap.NewProductionConfig() 27 } 28 if opts.Level != nil { 29 config.Level = opts.Level.(zap.AtomicLevel) 30 } else { 31 config.Level.SetLevel(zapcore.InfoLevel) 32 } 33 config.EncoderConfig.EncodeTime = zapcore.TimeEncoderOfLayout(timeFormat) 34 config.EncoderConfig.TimeKey = timeKey 35 config.EncoderConfig.MessageKey = messageKey 36 config.EncoderConfig.CallerKey = callerKey 37 logger, err := config.Build() 38 if err != nil { 39 zap.S().Errorf("Error creating logger %v", err) 40 } else { 41 zap.ReplaceGlobals(logger) 42 } 43 44 // Use a zap logr.Logger implementation. If none of the zap 45 // flags are configured (or if the zap flag set is not being 46 // used), this defaults to a production zap logger. 47 // 48 // The logger instantiated here can be changed to any logger 49 // implementing the logr.Logger interface. This logger will 50 // be propagated through the whole operator, generating 51 // uniform and structured logs. 52 // 53 // Add the caller field as an option otherwise the controller runtime logger 54 // will not include the caller field. 55 opts.ZapOpts = append(opts.ZapOpts, zap.AddCaller()) 56 encoder := zapcore.NewJSONEncoder(config.EncoderConfig) 57 ctrl.SetLogger(kzap.New(kzap.UseFlagOptions(&opts), kzap.Encoder(encoder))) 58 } 59 60 // BuildZapLogger initializes zap logger 61 func BuildZapLogger(callerSkip int) (*zap.SugaredLogger, error) { 62 config := zap.NewProductionConfig() 63 config.Level.SetLevel(zapcore.InfoLevel) 64 65 config.EncoderConfig.EncodeTime = zapcore.TimeEncoderOfLayout(timeFormat) 66 config.EncoderConfig.TimeKey = timeKey 67 config.EncoderConfig.MessageKey = messageKey 68 config.EncoderConfig.CallerKey = callerKey 69 logger, err := config.Build() 70 if err != nil { 71 return nil, err 72 } 73 l := logger.WithOptions(zap.AddCallerSkip(callerSkip)) 74 return l.Sugar(), nil 75 }