gitlab.com/gpdionisio/tendermint@v0.34.19-dev2/libs/cli/flags/log_level.go (about)

     1  package flags
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"strings"
     7  
     8  	"github.com/tendermint/tendermint/libs/log"
     9  )
    10  
    11  const (
    12  	defaultLogLevelKey = "*"
    13  )
    14  
    15  // ParseLogLevel parses complex log level - comma-separated
    16  // list of module:level pairs with an optional *:level pair (* means
    17  // all other modules).
    18  //
    19  // Example:
    20  //		ParseLogLevel("consensus:debug,mempool:debug,*:error", log.NewTMLogger(os.Stdout), "info")
    21  func ParseLogLevel(lvl string, logger log.Logger, defaultLogLevelValue string) (log.Logger, error) {
    22  	if lvl == "" {
    23  		return nil, errors.New("empty log level")
    24  	}
    25  
    26  	l := lvl
    27  
    28  	// prefix simple one word levels (e.g. "info") with "*"
    29  	if !strings.Contains(l, ":") {
    30  		l = defaultLogLevelKey + ":" + l
    31  	}
    32  
    33  	options := make([]log.Option, 0)
    34  
    35  	isDefaultLogLevelSet := false
    36  	var option log.Option
    37  	var err error
    38  
    39  	list := strings.Split(l, ",")
    40  	for _, item := range list {
    41  		moduleAndLevel := strings.Split(item, ":")
    42  
    43  		if len(moduleAndLevel) != 2 {
    44  			return nil, fmt.Errorf("expected list in a form of \"module:level\" pairs, given pair %s, list %s", item, list)
    45  		}
    46  
    47  		module := moduleAndLevel[0]
    48  		level := moduleAndLevel[1]
    49  
    50  		if module == defaultLogLevelKey {
    51  			option, err = log.AllowLevel(level)
    52  			if err != nil {
    53  				return nil, fmt.Errorf("failed to parse default log level (pair %s, list %s): %w", item, l, err)
    54  			}
    55  			options = append(options, option)
    56  			isDefaultLogLevelSet = true
    57  		} else {
    58  			switch level {
    59  			case "debug":
    60  				option = log.AllowDebugWith("module", module)
    61  			case "info":
    62  				option = log.AllowInfoWith("module", module)
    63  			case "error":
    64  				option = log.AllowErrorWith("module", module)
    65  			case "none":
    66  				option = log.AllowNoneWith("module", module)
    67  			default:
    68  				return nil,
    69  					fmt.Errorf("expected either \"info\", \"debug\", \"error\" or \"none\" log level, given %s (pair %s, list %s)",
    70  						level,
    71  						item,
    72  						list)
    73  			}
    74  			options = append(options, option)
    75  
    76  		}
    77  	}
    78  
    79  	// if "*" is not provided, set default global level
    80  	if !isDefaultLogLevelSet {
    81  		option, err = log.AllowLevel(defaultLogLevelValue)
    82  		if err != nil {
    83  			return nil, err
    84  		}
    85  		options = append(options, option)
    86  	}
    87  
    88  	return log.NewFilter(logger, options...), nil
    89  }