1
0
Fork 0
mirror of https://github.com/kyverno/kyverno.git synced 2025-03-31 03:45:17 +00:00

add and use package level logger (#4750)

* add and use package level logger

Signed-off-by: damilola olayinka <holayinkajr@gmail.com>

* small fixes

Signed-off-by: damilola olayinka <holayinkajr@gmail.com>

* fix comments

Signed-off-by: damilola olayinka <holayinkajr@gmail.com>

* add Info and Error functions

Signed-off-by: damilola olayinka <holayinkajr@gmail.com>

* small fixes

Signed-off-by: damilola olayinka <holayinkajr@gmail.com>

* move function calls

Signed-off-by: damilola olayinka <holayinkajr@gmail.com>

* replace init function

Signed-off-by: damilola olayinka <holayinkajr@gmail.com>

Signed-off-by: damilola olayinka <holayinkajr@gmail.com>
Co-authored-by: Charles-Edouard Brétéché <charled.breteche@gmail.com>
This commit is contained in:
yinka 2022-09-29 20:43:20 +01:00 committed by GitHub
parent 7fa796e24a
commit 528bcbad6b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 96 additions and 36 deletions

View file

@ -13,7 +13,6 @@ import (
"syscall" "syscall"
"time" "time"
"github.com/go-logr/zapr"
"github.com/kyverno/kyverno/pkg/background" "github.com/kyverno/kyverno/pkg/background"
"github.com/kyverno/kyverno/pkg/client/clientset/versioned" "github.com/kyverno/kyverno/pkg/client/clientset/versioned"
kyvernoinformer "github.com/kyverno/kyverno/pkg/client/informers/externalversions" kyvernoinformer "github.com/kyverno/kyverno/pkg/client/informers/externalversions"
@ -32,6 +31,7 @@ import (
"github.com/kyverno/kyverno/pkg/cosign" "github.com/kyverno/kyverno/pkg/cosign"
event "github.com/kyverno/kyverno/pkg/event" event "github.com/kyverno/kyverno/pkg/event"
"github.com/kyverno/kyverno/pkg/leaderelection" "github.com/kyverno/kyverno/pkg/leaderelection"
"github.com/kyverno/kyverno/pkg/logging"
"github.com/kyverno/kyverno/pkg/metrics" "github.com/kyverno/kyverno/pkg/metrics"
"github.com/kyverno/kyverno/pkg/openapi" "github.com/kyverno/kyverno/pkg/openapi"
"github.com/kyverno/kyverno/pkg/policy" "github.com/kyverno/kyverno/pkg/policy"
@ -48,15 +48,11 @@ import (
webhooksresource "github.com/kyverno/kyverno/pkg/webhooks/resource" webhooksresource "github.com/kyverno/kyverno/pkg/webhooks/resource"
webhookgenerate "github.com/kyverno/kyverno/pkg/webhooks/updaterequest" webhookgenerate "github.com/kyverno/kyverno/pkg/webhooks/updaterequest"
_ "go.uber.org/automaxprocs" // #nosec _ "go.uber.org/automaxprocs" // #nosec
"go.uber.org/zap"
kubeinformers "k8s.io/client-go/informers" kubeinformers "k8s.io/client-go/informers"
"k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes"
metadataclient "k8s.io/client-go/metadata" metadataclient "k8s.io/client-go/metadata"
metadatainformers "k8s.io/client-go/metadata/metadatainformer" metadatainformers "k8s.io/client-go/metadata/metadatainformer"
"k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/cache"
"k8s.io/klog/v2"
"k8s.io/klog/v2/klogr"
"sigs.k8s.io/controller-runtime/pkg/log"
) )
const ( const (
@ -90,20 +86,16 @@ var (
backgroundScan bool backgroundScan bool
admissionReports bool admissionReports bool
reportsChunkSize int reportsChunkSize int
setupLog = log.Log.WithName("setup") setupLog = logging.WithName("setup")
logFormat string logFormat string
// DEPRECATED: remove in 1.9 // DEPRECATED: remove in 1.9
splitPolicyReport bool splitPolicyReport bool
) )
func main() { func main() {
// clear flags initialized in static dependencies logging.Init(nil)
if flag.CommandLine.Lookup("log_dir") != nil {
flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
}
klog.InitFlags(nil) flag.StringVar(&logFormat, "loggingFormat", logging.JSONFormat, "This determines the output format of the logger.")
flag.StringVar(&logFormat, "loggingFormat", "text", "This determines the output format of the logger.")
flag.IntVar(&webhookTimeout, "webhookTimeout", int(webhookconfig.DefaultWebhookTimeout), "Timeout for webhook configurations.") flag.IntVar(&webhookTimeout, "webhookTimeout", int(webhookconfig.DefaultWebhookTimeout), "Timeout for webhook configurations.")
flag.IntVar(&genWorkers, "genWorkers", 10, "Workers for generate controller.") flag.IntVar(&genWorkers, "genWorkers", 10, "Workers for generate controller.")
flag.IntVar(&maxQueuedEvents, "maxQueuedEvents", 1000, "Maximum events to be queued.") flag.IntVar(&maxQueuedEvents, "maxQueuedEvents", 1000, "Maximum events to be queued.")
@ -138,21 +130,8 @@ func main() {
} }
flag.Parse() flag.Parse()
if logFormat == "text" { if err := logging.Setup(logFormat); err != nil {
// in text mode we use FormatSerialize format fmt.Printf("failed to setup logger: %v", err)
log.SetLogger(klogr.New())
} else if logFormat == "json" {
zapLog, err := zap.NewProduction()
if err != nil {
fmt.Printf("failed to initialize JSON logger: %s", err.Error())
os.Exit(1)
}
klog.SetLogger(zapr.NewLogger(zapLog))
// in json mode we use FormatKlog format
log.SetLogger(klog.NewKlogr())
} else {
fmt.Println("log format not recognized, pass `text` for text mode or `json` to enable JSON logging")
os.Exit(1) os.Exit(1)
} }
@ -160,7 +139,7 @@ func main() {
setupLog.Info("The splitPolicyReport flag is deprecated and will be removed in v1.9. It has no effect and should be removed.") setupLog.Info("The splitPolicyReport flag is deprecated and will be removed in v1.9. It has no effect and should be removed.")
} }
version.PrintVersionInfo(log.Log) version.PrintVersionInfo(logging.GlobalLogger())
// os signal handler // os signal handler
signalCtx, signalCancel := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) signalCtx, signalCancel := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
@ -200,7 +179,7 @@ func main() {
metricsConfigData, metricsConfigData,
transportCreds, transportCreds,
kubeClient, kubeClient,
log.Log.WithName("Metrics"), logging.WithName("Metrics"),
) )
if err != nil { if err != nil {
setupLog.Error(err, "failed to initialize metrics") setupLog.Error(err, "failed to initialize metrics")
@ -304,7 +283,7 @@ func main() {
// EVENT GENERATOR // EVENT GENERATOR
// - generate event with retry mechanism // - generate event with retry mechanism
eventGenerator := event.NewEventGenerator(dynamicClient, kyvernoV1.ClusterPolicies(), kyvernoV1.Policies(), maxQueuedEvents, log.Log.WithName("EventGenerator")) eventGenerator := event.NewEventGenerator(dynamicClient, kyvernoV1.ClusterPolicies(), kyvernoV1.Policies(), maxQueuedEvents, logging.WithName("EventGenerator"))
webhookCfg := webhookconfig.NewRegister( webhookCfg := webhookconfig.NewRegister(
clientConfig, clientConfig,
@ -322,10 +301,10 @@ func main() {
debug, debug,
autoUpdateWebhooks, autoUpdateWebhooks,
stopCh, stopCh,
log.Log, logging.GlobalLogger(),
) )
webhookMonitor, err := webhookconfig.NewMonitor(kubeClient, log.Log) webhookMonitor, err := webhookconfig.NewMonitor(kubeClient, logging.GlobalLogger())
if err != nil { if err != nil {
setupLog.Error(err, "failed to initialize webhookMonitor") setupLog.Error(err, "failed to initialize webhookMonitor")
os.Exit(1) os.Exit(1)
@ -341,7 +320,7 @@ func main() {
// Tracing Configuration // Tracing Configuration
if enableTracing { if enableTracing {
setupLog.V(2).Info("Enabling tracing for Kyverno...") setupLog.V(2).Info("Enabling tracing for Kyverno...")
tracerProvider, err := tracing.NewTraceConfig(otelCollector, transportCreds, kubeClient, log.Log.WithName("Tracing")) tracerProvider, err := tracing.NewTraceConfig(otelCollector, transportCreds, kubeClient, logging.WithName("Tracing"))
if err != nil { if err != nil {
setupLog.Error(err, "Failed to enable tracing for Kyverno") setupLog.Error(err, "Failed to enable tracing for Kyverno")
os.Exit(1) os.Exit(1)
@ -364,7 +343,7 @@ func main() {
configuration, configuration,
eventGenerator, eventGenerator,
kubeInformer.Core().V1().Namespaces(), kubeInformer.Core().V1().Namespaces(),
log.Log.WithName("PolicyController"), logging.WithName("PolicyController"),
time.Hour, time.Hour,
metricsConfig, metricsConfig,
) )
@ -397,7 +376,7 @@ func main() {
tls.CAValidityDuration, tls.CAValidityDuration,
tls.TLSValidityDuration, tls.TLSValidityDuration,
serverIP, serverIP,
log.Log.WithName("CertRenewer"), logging.WithName("CertRenewer"),
) )
if err != nil { if err != nil {
setupLog.Error(err, "failed to initialize CertRenewer") setupLog.Error(err, "failed to initialize CertRenewer")
@ -502,7 +481,7 @@ func main() {
server.Stop(c) server.Stop(c)
} }
le, err := leaderelection.New("kyverno", config.KyvernoNamespace(), kubeClientLeaderElection, config.KyvernoPodName(), run, stop, log.Log.WithName("kyverno/LeaderElection")) le, err := leaderelection.New("kyverno", config.KyvernoNamespace(), kubeClientLeaderElection, config.KyvernoPodName(), run, stop, logging.WithName("kyverno/LeaderElection"))
if err != nil { if err != nil {
setupLog.Error(err, "failed to elect a leader") setupLog.Error(err, "failed to elect a leader")
os.Exit(1) os.Exit(1)

81
pkg/logging/log.go Normal file
View file

@ -0,0 +1,81 @@
package logging
import (
"errors"
"flag"
"os"
"github.com/go-logr/logr"
"github.com/go-logr/zapr"
"go.uber.org/zap"
"k8s.io/klog/v2"
"k8s.io/klog/v2/klogr"
"sigs.k8s.io/controller-runtime/pkg/log"
)
const (
// JSONFormat represents JSON logging mode.
JSONFormat = "json"
// TextFormat represents text logging mode.
// Default logging mode is TextFormat.
TextFormat = "text"
)
func Init(flags *flag.FlagSet) {
// clear flags initialized in static dependencies
if flag.CommandLine.Lookup("log_dir") != nil {
flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
}
klog.InitFlags(flags)
}
// Setup configures the logger with the supplied log format.
// It returns an error if the JSON logger could not be initialized or passed logFormat is not recognized.
func Setup(logFormat string) error {
switch logFormat {
case TextFormat:
// in text mode we use FormatSerialize format
log.SetLogger(klogr.New())
return nil
case JSONFormat:
zapLog, err := zap.NewProduction()
if err != nil {
return errors.New("JSON logger could not be initialized")
}
klog.SetLogger(zapr.NewLogger(zapLog))
// in json mode we use FormatKlog format
log.SetLogger(klog.NewKlogr())
return nil
}
return errors.New("log format not recognized, pass `text` for text mode or `json` to enable JSON logging")
}
// GlobalLogger returns a logr.Logger as configured in main.
func GlobalLogger() logr.Logger {
return log.Log
}
// WithName returns a new logr.Logger instance with the specified name element added to the Logger's name.
func WithName(name string) logr.Logger {
return GlobalLogger().WithName(name)
}
// WithValues returns a new logr.Logger instance with additional key/value pairs.
func WithValues(keysAndValues ...interface{}) logr.Logger {
return GlobalLogger().WithValues(keysAndValues...)
}
// V returns a new logr.Logger instance for a specific verbosity level.
func V(level int) logr.Logger {
return GlobalLogger().V(level)
}
// Info logs a non-error message with the given key/value pairs.
func Info(msg string, keysAndValues ...interface{}) {
GlobalLogger().Info(msg, keysAndValues...)
}
// Error logs an error, with the given message and key/value pairs.
func Error(err error, msg string, keysAndValues ...interface{}) {
GlobalLogger().Error(err, msg, keysAndValues...)
}