Skip to content

Commit 9694e46

Browse files
authored
feat(flags): read log levels from flags (#1953)
1 parent f7f4463 commit 9694e46

File tree

3 files changed

+384
-94
lines changed

3 files changed

+384
-94
lines changed

cmd/gossamer/config.go

Lines changed: 107 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package main
1818

1919
import (
20+
"errors"
2021
"fmt"
2122
"strconv"
2223
"strings"
@@ -287,118 +288,131 @@ func createExportConfig(ctx *cli.Context) (*dot.Config, error) {
287288
return cfg, nil
288289
}
289290

290-
func setLogConfig(ctx *cli.Context, cfg *ctoml.Config, globalCfg *dot.GlobalConfig, logCfg *dot.LogConfig) error {
291-
if cfg == nil {
292-
cfg = new(ctoml.Config)
293-
}
294-
295-
if lvlStr := ctx.String(LogFlag.Name); lvlStr != "" {
296-
if lvlToInt, err := strconv.Atoi(lvlStr); err == nil {
297-
lvlStr = log.Lvl(lvlToInt).String()
298-
}
299-
cfg.Global.LogLvl = lvlStr
300-
}
301-
302-
if cfg.Global.LogLvl == "" {
303-
cfg.Global.LogLvl = gssmr.DefaultLvl.String()
304-
}
305-
306-
var err error
307-
globalCfg.LogLvl, err = log.LvlFromString(cfg.Global.LogLvl)
308-
if err != nil {
309-
return err
310-
}
311-
312-
// check and set log levels for each pkg
313-
if cfg.Log.CoreLvl == "" {
314-
logCfg.CoreLvl = globalCfg.LogLvl
315-
} else {
316-
lvl, err := log.LvlFromString(cfg.Log.CoreLvl)
317-
if err != nil {
318-
return err
319-
}
320-
321-
logCfg.CoreLvl = lvl
322-
}
323-
324-
if cfg.Log.SyncLvl == "" {
325-
logCfg.SyncLvl = globalCfg.LogLvl
326-
} else {
327-
lvl, err := log.LvlFromString(cfg.Log.SyncLvl)
328-
if err != nil {
329-
return err
330-
}
291+
type stringKVStore interface {
292+
String(key string) (value string)
293+
}
331294

332-
logCfg.SyncLvl = lvl
295+
// getLogLevel obtains the log level in the following order:
296+
// 1. Try to obtain it from the flag value corresponding to flagName.
297+
// 2. Try to obtain it from the TOML value given, if step 1. failed.
298+
// 3. Return the default value given if both previous steps failed.
299+
// For steps 1 and 2, it tries to parse the level as an integer to convert it
300+
// to a level, and also tries to parse it as a string.
301+
func getLogLevel(flagsKVStore stringKVStore, flagName, tomlValue string, defaultLevel log.Lvl) (
302+
level log.Lvl, err error) {
303+
if flagValue := flagsKVStore.String(flagName); flagValue != "" {
304+
return parseLogLevelString(flagValue)
333305
}
334306

335-
if cfg.Log.NetworkLvl == "" {
336-
logCfg.NetworkLvl = globalCfg.LogLvl
337-
} else {
338-
lvl, err := log.LvlFromString(cfg.Log.NetworkLvl)
339-
if err != nil {
340-
return err
341-
}
342-
343-
logCfg.NetworkLvl = lvl
307+
if tomlValue == "" {
308+
return defaultLevel, nil
344309
}
345310

346-
if cfg.Log.RPCLvl == "" {
347-
logCfg.RPCLvl = globalCfg.LogLvl
348-
} else {
349-
lvl, err := log.LvlFromString(cfg.Log.RPCLvl)
350-
if err != nil {
351-
return err
352-
}
311+
return parseLogLevelString(tomlValue)
312+
}
353313

354-
logCfg.RPCLvl = lvl
355-
}
314+
var ErrLogLevelIntegerOutOfRange = errors.New("log level integer can only be between 0 and 5 included")
356315

357-
if cfg.Log.StateLvl == "" {
358-
logCfg.StateLvl = globalCfg.LogLvl
359-
} else {
360-
lvl, err := log.LvlFromString(cfg.Log.StateLvl)
361-
if err != nil {
362-
return err
316+
func parseLogLevelString(logLevelString string) (logLevel log.Lvl, err error) {
317+
levelInt, err := strconv.Atoi(logLevelString)
318+
if err == nil { // level given as an integer
319+
if levelInt < 0 || levelInt > 5 {
320+
return 0, fmt.Errorf("%w: log level given: %d", ErrLogLevelIntegerOutOfRange, levelInt)
363321
}
364-
365-
logCfg.StateLvl = lvl
322+
logLevel = log.Lvl(levelInt)
323+
return logLevel, nil
366324
}
367325

368-
if cfg.Log.RuntimeLvl == "" {
369-
logCfg.RuntimeLvl = globalCfg.LogLvl
370-
} else {
371-
lvl, err := log.LvlFromString(cfg.Log.RuntimeLvl)
372-
if err != nil {
373-
return err
374-
}
375-
376-
logCfg.RuntimeLvl = lvl
326+
logLevel, err = log.LvlFromString(logLevelString)
327+
if err != nil {
328+
return 0, fmt.Errorf("cannot parse log level string: %w", err)
377329
}
378330

379-
if cfg.Log.BlockProducerLvl == "" {
380-
logCfg.BlockProducerLvl = globalCfg.LogLvl
381-
} else {
382-
lvl, err := log.LvlFromString(cfg.Log.BlockProducerLvl)
383-
if err != nil {
384-
return err
385-
}
331+
return logLevel, nil
332+
}
386333

387-
logCfg.BlockProducerLvl = lvl
334+
func setLogConfig(flagsKVStore stringKVStore, cfg *ctoml.Config, globalCfg *dot.GlobalConfig, logCfg *dot.LogConfig) (err error) {
335+
if cfg == nil {
336+
cfg = new(ctoml.Config)
388337
}
389338

390-
if cfg.Log.FinalityGadgetLvl == "" {
391-
logCfg.FinalityGadgetLvl = globalCfg.LogLvl
392-
} else {
393-
lvl, err := log.LvlFromString(cfg.Log.FinalityGadgetLvl)
339+
globalCfg.LogLvl, err = getLogLevel(flagsKVStore, LogFlag.Name, cfg.Global.LogLvl, gssmr.DefaultLvl)
340+
if err != nil {
341+
return fmt.Errorf("cannot get global log level: %w", err)
342+
}
343+
cfg.Global.LogLvl = globalCfg.LogLvl.String()
344+
345+
levelsData := []struct {
346+
name string
347+
flagName string
348+
tomlValue string
349+
levelPtr *log.Lvl // pointer to value to modify
350+
}{
351+
{
352+
name: "core",
353+
flagName: LogCoreLevelFlag.Name,
354+
tomlValue: cfg.Log.CoreLvl,
355+
levelPtr: &logCfg.CoreLvl,
356+
},
357+
{
358+
name: "sync",
359+
flagName: LogSyncLevelFlag.Name,
360+
tomlValue: cfg.Log.SyncLvl,
361+
levelPtr: &logCfg.SyncLvl,
362+
},
363+
{
364+
name: "network",
365+
flagName: LogNetworkLevelFlag.Name,
366+
tomlValue: cfg.Log.NetworkLvl,
367+
levelPtr: &logCfg.NetworkLvl,
368+
},
369+
{
370+
name: "RPC",
371+
flagName: LogRPCLevelFlag.Name,
372+
tomlValue: cfg.Log.RPCLvl,
373+
levelPtr: &logCfg.RPCLvl,
374+
},
375+
{
376+
name: "state",
377+
flagName: LogStateLevelFlag.Name,
378+
tomlValue: cfg.Log.StateLvl,
379+
levelPtr: &logCfg.StateLvl,
380+
},
381+
{
382+
name: "runtime",
383+
flagName: LogRuntimeLevelFlag.Name,
384+
tomlValue: cfg.Log.RuntimeLvl,
385+
levelPtr: &logCfg.RuntimeLvl,
386+
},
387+
{
388+
name: "block producer",
389+
flagName: LogBabeLevelFlag.Name,
390+
tomlValue: cfg.Log.BlockProducerLvl,
391+
levelPtr: &logCfg.BlockProducerLvl,
392+
},
393+
{
394+
name: "finality gadget",
395+
flagName: LogGrandpaLevelFlag.Name,
396+
tomlValue: cfg.Log.FinalityGadgetLvl,
397+
levelPtr: &logCfg.FinalityGadgetLvl,
398+
},
399+
{
400+
name: "sync",
401+
flagName: LogSyncLevelFlag.Name,
402+
tomlValue: cfg.Log.SyncLvl,
403+
levelPtr: &logCfg.SyncLvl,
404+
},
405+
}
406+
407+
for _, levelData := range levelsData {
408+
level, err := getLogLevel(flagsKVStore, levelData.flagName, levelData.tomlValue, globalCfg.LogLvl)
394409
if err != nil {
395-
return err
410+
return fmt.Errorf("cannot get %s log level: %w", levelData.name, err)
396411
}
397-
398-
logCfg.FinalityGadgetLvl = lvl
412+
*levelData.levelPtr = level
399413
}
400414

401-
logger.Debug("set log configuration", "--log", ctx.String(LogFlag.Name), "global", globalCfg.LogLvl)
415+
logger.Debug("set log configuration", "--log", flagsKVStore.String(LogFlag.Name), "global", globalCfg.LogLvl)
402416
return nil
403417
}
404418

0 commit comments

Comments
 (0)