57 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
| package logging
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"os"
 | |
| 	"strconv"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/go-logr/logr"
 | |
| 	zaplib "go.uber.org/zap"
 | |
| 	"go.uber.org/zap/zapcore"
 | |
| 	"sigs.k8s.io/controller-runtime/pkg/log/zap"
 | |
| )
 | |
| 
 | |
| const (
 | |
| 	LogLevelDebug = "debug"
 | |
| 	LogLevelInfo  = "info"
 | |
| 	LogLevelWarn  = "warn"
 | |
| 	LogLevelError = "error"
 | |
| )
 | |
| 
 | |
| func NewLogger(logLevel string) logr.Logger {
 | |
| 	log := zap.New(func(o *zap.Options) {
 | |
| 		switch logLevel {
 | |
| 		case LogLevelDebug:
 | |
| 			o.Development = true
 | |
| 			lvl := zaplib.NewAtomicLevelAt(zaplib.DebugLevel) // maps to logr's V(1)
 | |
| 			o.Level = &lvl
 | |
| 		case LogLevelInfo:
 | |
| 			lvl := zaplib.NewAtomicLevelAt(zaplib.InfoLevel)
 | |
| 			o.Level = &lvl
 | |
| 		case LogLevelWarn:
 | |
| 			lvl := zaplib.NewAtomicLevelAt(zaplib.WarnLevel)
 | |
| 			o.Level = &lvl
 | |
| 		case LogLevelError:
 | |
| 			lvl := zaplib.NewAtomicLevelAt(zaplib.ErrorLevel)
 | |
| 			o.Level = &lvl
 | |
| 		default:
 | |
| 			// We use bitsize of 8 as zapcore.Level is a type alias to int8
 | |
| 			levelInt, err := strconv.ParseInt(logLevel, 10, 8)
 | |
| 			if err != nil {
 | |
| 				fmt.Fprintf(os.Stderr, "Failed to parse --log-level=%s: %v", logLevel, err)
 | |
| 				os.Exit(1)
 | |
| 			}
 | |
| 
 | |
| 			// For example, --log-level=debug a.k.a --log-level=-1 maps to zaplib.DebugLevel, which is associated to logr's V(1)
 | |
| 			// --log-level=-2 maps the specific custom log level that is associated to logr's V(2).
 | |
| 			level := zapcore.Level(levelInt)
 | |
| 			atomicLevel := zaplib.NewAtomicLevelAt(level)
 | |
| 			o.Level = &atomicLevel
 | |
| 		}
 | |
| 		o.TimeEncoder = zapcore.TimeEncoderOfLayout(time.RFC3339)
 | |
| 	})
 | |
| 
 | |
| 	return log
 | |
| }
 |