|
17 | 17 | package main
|
18 | 18 |
|
19 | 19 | import (
|
| 20 | + "errors" |
20 | 21 | "fmt"
|
21 | 22 | "strconv"
|
22 | 23 | "strings"
|
@@ -287,118 +288,131 @@ func createExportConfig(ctx *cli.Context) (*dot.Config, error) {
|
287 | 288 | return cfg, nil
|
288 | 289 | }
|
289 | 290 |
|
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 | +} |
331 | 294 |
|
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) |
333 | 305 | }
|
334 | 306 |
|
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 |
344 | 309 | }
|
345 | 310 |
|
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 | +} |
353 | 313 |
|
354 |
| - logCfg.RPCLvl = lvl |
355 |
| - } |
| 314 | +var ErrLogLevelIntegerOutOfRange = errors.New("log level integer can only be between 0 and 5 included") |
356 | 315 |
|
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) |
363 | 321 | }
|
364 |
| - |
365 |
| - logCfg.StateLvl = lvl |
| 322 | + logLevel = log.Lvl(levelInt) |
| 323 | + return logLevel, nil |
366 | 324 | }
|
367 | 325 |
|
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) |
377 | 329 | }
|
378 | 330 |
|
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 | +} |
386 | 333 |
|
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) |
388 | 337 | }
|
389 | 338 |
|
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) |
394 | 409 | if err != nil {
|
395 |
| - return err |
| 410 | + return fmt.Errorf("cannot get %s log level: %w", levelData.name, err) |
396 | 411 | }
|
397 |
| - |
398 |
| - logCfg.FinalityGadgetLvl = lvl |
| 412 | + *levelData.levelPtr = level |
399 | 413 | }
|
400 | 414 |
|
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) |
402 | 416 | return nil
|
403 | 417 | }
|
404 | 418 |
|
|
0 commit comments