@@ -18,14 +18,17 @@ package main
1818
1919import (
2020 "flag"
21+ "log/slog"
2122 "net/http"
2223 "os"
24+ "strings"
2325
26+ "github.com/go-logr/logr"
2427 "github.com/prometheus/client_golang/prometheus/promhttp"
25- "github.com/sirupsen/logrus"
2628 _ "k8s.io/client-go/plugin/pkg/client/auth"
2729 "k8s.io/klog"
2830 "sigs.k8s.io/controller-runtime/pkg/client/config"
31+ ctrl "sigs.k8s.io/controller-runtime/pkg/log"
2932 "sigs.k8s.io/controller-runtime/pkg/manager"
3033 "sigs.k8s.io/controller-runtime/pkg/manager/signals"
3134
@@ -36,78 +39,117 @@ import (
3639 "github.com/fairwindsops/rbac-manager/version"
3740)
3841
39- var logLevel = flag .String ("log-level" , logrus . InfoLevel . String () , "Logrus log level" )
42+ var logLevel = flag .String ("log-level" , "info" , "Log level (debug, info, warn, error) " )
4043var addr = flag .String ("metrics-address" , ":8042" , "The address to serve prometheus metrics." )
4144
4245func init () {
4346 klog .InitFlags (nil )
4447}
4548
49+ func parseLogLevel (level string ) slog.Level {
50+ switch strings .ToLower (level ) {
51+ case "debug" :
52+ return slog .LevelDebug
53+ case "info" :
54+ return slog .LevelInfo
55+ case "warn" , "warning" :
56+ return slog .LevelWarn
57+ case "error" :
58+ return slog .LevelError
59+ default :
60+ return slog .LevelInfo
61+ }
62+ }
63+
64+ // slogToLogrAdapter adapts slog.Logger to logr.Logger for controller-runtime
65+ type slogToLogrAdapter struct {
66+ logger * slog.Logger
67+ }
68+
69+ func (a * slogToLogrAdapter ) Init (info logr.RuntimeInfo ) {}
70+ func (a * slogToLogrAdapter ) Enabled (level int ) bool { return true }
71+ func (a * slogToLogrAdapter ) Info (level int , msg string , keysAndValues ... interface {}) {
72+ a .logger .Info (msg , keysAndValues ... )
73+ }
74+ func (a * slogToLogrAdapter ) Error (err error , msg string , keysAndValues ... interface {}) {
75+ args := append ([]interface {}{"error" , err }, keysAndValues ... )
76+ a .logger .Error (msg , args ... )
77+ }
78+ func (a * slogToLogrAdapter ) WithValues (keysAndValues ... interface {}) logr.LogSink {
79+ return & slogToLogrAdapter {logger : a .logger .With (keysAndValues ... )}
80+ }
81+ func (a * slogToLogrAdapter ) WithName (name string ) logr.LogSink {
82+ return & slogToLogrAdapter {logger : a .logger .With ("name" , name )}
83+ }
84+
4685func main () {
4786 flag .Parse ()
4887
49- parsedLevel , err := logrus .ParseLevel (* logLevel )
50- if err != nil {
51- // This should theoretically never happen
52- logrus .Errorf ("log-level flag has invalid value %s" , * logLevel )
53- } else {
54- logrus .SetLevel (parsedLevel )
88+ level := parseLogLevel (* logLevel )
89+ opts := & slog.HandlerOptions {
90+ Level : level ,
5591 }
92+ logger := slog .New (slog .NewTextHandler (os .Stderr , opts ))
93+ slog .SetDefault (logger )
94+
95+ // Set up controller-runtime logger to use slog via adapter
96+ logrLogger := logr .New (& slogToLogrAdapter {logger : logger })
97+ ctrl .SetLogger (logrLogger )
5698
57- logrus .Info ("----------------------------------" )
58- logrus . Infof ("rbac-manager %v running" , version .Version )
59- logrus .Info ("----------------------------------" )
99+ slog .Info ("----------------------------------" )
100+ slog . Info ("rbac-manager running" , "version " , version .Version )
101+ slog .Info ("----------------------------------" )
60102
61103 // Get a config to talk to the apiserver
62- logrus .Debug ("Setting up client for manager" )
104+ slog .Debug ("Setting up client for manager" )
63105 cfg , err := config .GetConfig ()
64106 if err != nil {
65- logrus .Error (err , ": unable to set up client config" )
107+ slog .Error (" unable to set up client config", "error" , err )
66108 os .Exit (1 )
67109 }
68110
69111 // Create a new Cmd to provide shared dependencies and start components
70- logrus .Debug ("Setting up manager" )
112+ slog .Debug ("Setting up manager" )
71113 mgr , err := manager .New (cfg , manager.Options {})
72114 if err != nil {
73- logrus .Error (err , ": unable to set up overall controller manager" )
115+ slog .Error (" unable to set up overall controller manager", "error" , err )
74116 os .Exit (1 )
75117 }
76118
77- logrus .Info ("Registering components" )
119+ slog .Info ("Registering components" )
78120
79121 // Setup Scheme for all resources
80- logrus .Debug ("Setting up scheme" )
122+ slog .Debug ("Setting up scheme" )
81123 if err := apis .AddToScheme (mgr .GetScheme ()); err != nil {
82- logrus .Error (err , ": unable add APIs to scheme" )
124+ slog .Error (" unable add APIs to scheme", "error" , err )
83125 os .Exit (1 )
84126 }
85127
86128 // Setup all Controllers
87- logrus .Debug ("Setting up controller" )
129+ slog .Debug ("Setting up controller" )
88130 if err := controller .Add (mgr ); err != nil {
89- logrus .Error (err , ": unable to register controller to the manager" )
131+ slog .Error (" unable to register controller to the manager", "error" , err )
90132 os .Exit (1 )
91133 }
92134
93135 // Watch Related Resources
94- logrus .Info ("Watching resources related to RBAC Definitions" )
136+ slog .Info ("Watching resources related to RBAC Definitions" )
95137 watcher .WatchRelatedResources ()
96138
97139 // Start metrics endpoint
98140 go func () {
99141 metrics .RegisterMetrics ()
100142 http .Handle ("/metrics" , promhttp .Handler ())
101143 if err := http .ListenAndServe (* addr , nil ); err != nil {
102- logrus .Error (err , ": unable to serve the metrics endpoint" )
144+ slog .Error (" unable to serve the metrics endpoint", "error" , err )
103145 os .Exit (1 )
104146 }
105147 }()
106148
107149 // Start the Cmd
108- logrus .Info ("Watching RBAC Definitions" )
150+ slog .Info ("Watching RBAC Definitions" )
109151 if err := mgr .Start (signals .SetupSignalHandler ()); err != nil {
110- logrus .Error (err , ": unable to run the manager" )
152+ slog .Error (" unable to run the manager", "error" , err )
111153 os .Exit (1 )
112154 }
113155}
0 commit comments