github.com/line/ostracon@v1.0.10-0.20230328032236-7f20145f065d/libs/log/log_level.go (about)

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