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  }