@@ -15,11 +15,15 @@ package main
1515import (
1616 "context"
1717 "fmt"
18+ "log/slog"
1819 "net/http"
1920 "net/http/pprof"
2021 "os"
22+ "slices"
2123 "strings"
2224
25+ "github.com/prometheus/common/promslog"
26+ promslogflag "github.com/prometheus/common/promslog/flag"
2327 "github.com/urfave/cli/v2"
2428 "golang.org/x/sync/semaphore"
2529
@@ -28,7 +32,6 @@ import (
2832 v1 "github.com/prometheus-community/yet-another-cloudwatch-exporter/pkg/clients/v1"
2933 v2 "github.com/prometheus-community/yet-another-cloudwatch-exporter/pkg/clients/v2"
3034 "github.com/prometheus-community/yet-another-cloudwatch-exporter/pkg/config"
31- "github.com/prometheus-community/yet-another-cloudwatch-exporter/pkg/logging"
3235)
3336
3437const (
@@ -56,7 +59,7 @@ const (
5659var (
5760 addr string
5861 configFile string
59- debug bool
62+ logLevel string
6063 logFormat string
6164 fips bool
6265 cloudwatchConcurrency cloudwatch.ConcurrencyConfig
@@ -66,17 +69,19 @@ var (
6669 labelsSnakeCase bool
6770 profilingEnabled bool
6871
69- logger logging .Logger
72+ logger * slog .Logger
7073)
7174
7275func main () {
7376 app := NewYACEApp ()
7477 if err := app .Run (os .Args ); err != nil {
7578 // if we exit very early we'll not have set up the logger yet
7679 if logger == nil {
77- logger = logging .NewLogger (defaultLogFormat , debug , "version" , version )
80+ jsonFmt := & promslog.AllowedFormat {}
81+ _ = jsonFmt .Set ("json" )
82+ logger = promslog .New (& promslog.Config {Format : jsonFmt })
7883 }
79- logger .Error (err , "Error running yace" )
84+ logger .Error ("Error running yace" , "err" , err )
8085 os .Exit (1 )
8186 }
8287}
@@ -107,23 +112,25 @@ func NewYACEApp() *cli.App {
107112 Destination : & configFile ,
108113 EnvVars : []string {"config.file" },
109114 },
110- & cli.BoolFlag {
111- Name : "debug" ,
112- Value : false ,
113- Usage : "Verbose logging" ,
114- Destination : & debug ,
115- EnvVars : []string {"debug" },
115+ & cli.StringFlag {
116+ Name : "log.level" ,
117+ Value : "" ,
118+ Usage : promslogflag .LevelFlagHelp ,
119+ Destination : & logLevel ,
120+ Action : func (_ * cli.Context , s string ) error {
121+ if ! slices .Contains (promslog .LevelFlagOptions , s ) {
122+ return fmt .Errorf ("unrecognized log format %q" , s )
123+ }
124+ return nil
125+ },
116126 },
117127 & cli.StringFlag {
118128 Name : "log.format" ,
119129 Value : defaultLogFormat ,
120- Usage : "Output format of log messages. One of: [logfmt, json]. Default: [json]." ,
130+ Usage : promslogflag . FormatFlagHelp ,
121131 Destination : & logFormat ,
122132 Action : func (_ * cli.Context , s string ) error {
123- switch s {
124- case "logfmt" , "json" :
125- break
126- default :
133+ if ! slices .Contains (promslog .FormatFlagOptions , s ) {
127134 return fmt .Errorf ("unrecognized log format %q" , s )
128135 }
129136 return nil
@@ -212,11 +219,11 @@ func NewYACEApp() *cli.App {
212219 & cli.StringFlag {Name : "config.file" , Value : "config.yml" , Usage : "Path to configuration file." , Destination : & configFile },
213220 },
214221 Action : func (_ * cli.Context ) error {
215- logger = logging . NewLogger (logFormat , debug , "version" , version )
222+ logger = newLogger (logFormat , logLevel ). With ( "version" , version )
216223 logger .Info ("Parsing config" )
217224 cfg := config.ScrapeConf {}
218225 if _ , err := cfg .Load (configFile , logger ); err != nil {
219- logger .Error (err , "Couldn't read config file" , "path" , configFile )
226+ logger .Error ("Couldn't read config file" , "err" , err , "path" , configFile )
220227 os .Exit (1 )
221228 }
222229 logger .Info ("Config file is valid" , "path" , configFile )
@@ -242,7 +249,7 @@ func NewYACEApp() *cli.App {
242249}
243250
244251func startScraper (c * cli.Context ) error {
245- logger = logging . NewLogger (logFormat , debug , "version" , version )
252+ logger = newLogger (logFormat , logLevel ). With ( "version" , version )
246253
247254 // log warning if the two concurrency limiting methods are configured via CLI
248255 if c .IsSet ("cloudwatch-concurrency" ) && c .IsSet ("cloudwatch-concurrency.per-api-limit-enabled" ) {
@@ -310,7 +317,7 @@ func startScraper(c *cli.Context) error {
310317 newCfg := config.ScrapeConf {}
311318 newJobsCfg , err := newCfg .Load (configFile , logger )
312319 if err != nil {
313- logger .Error (err , "Couldn't read config file" , "path" , configFile )
320+ logger .Error ("Couldn't read config file" , "err" , err , "path" , configFile )
314321 return
315322 }
316323
@@ -323,7 +330,7 @@ func startScraper(c *cli.Context) error {
323330 // Can't override cache while also creating err
324331 cache , err = v2 .NewFactory (logger , newJobsCfg , fips )
325332 if err != nil {
326- logger .Error (err , "Failed to construct aws sdk v2 client cache" , "path" , configFile )
333+ logger .Error ("Failed to construct aws sdk v2 client cache" , "err" , err , "path" , configFile )
327334 return
328335 }
329336 }
@@ -339,3 +346,16 @@ func startScraper(c *cli.Context) error {
339346 srv := & http.Server {Addr : addr , Handler : mux }
340347 return srv .ListenAndServe ()
341348}
349+
350+ func newLogger (format , level string ) * slog.Logger {
351+ // If flag parsing was successful, then we know that format and level
352+ // are both valid options; no need to error check their returns, just
353+ // set their values.
354+ f := & promslog.AllowedFormat {}
355+ _ = f .Set (format )
356+
357+ lvl := & promslog.AllowedLevel {}
358+ _ = lvl .Set (level )
359+
360+ return promslog .New (& promslog.Config {Format : f , Level : lvl })
361+ }
0 commit comments