7 "github.com/pkg/errors"
9 "github.com/tendermint/tmlibs/log"
13 defaultLogLevelKey = "*"
16 // ParseLogLevel parses complex log level - comma-separated
17 // list of module:level pairs with an optional *:level pair (* means
18 // all other modules).
21 // ParseLogLevel("consensus:debug,mempool:debug,*:error", log.NewTMLogger(os.Stdout), "info")
22 func ParseLogLevel(lvl string, logger log.Logger, defaultLogLevelValue string) (log.Logger, error) {
24 return nil, errors.New("Empty log level")
29 // prefix simple one word levels (e.g. "info") with "*"
30 if !strings.Contains(l, ":") {
31 l = defaultLogLevelKey + ":" + l
34 options := make([]log.Option, 0)
36 isDefaultLogLevelSet := false
40 list := strings.Split(l, ",")
41 for _, item := range list {
42 moduleAndLevel := strings.Split(item, ":")
44 if len(moduleAndLevel) != 2 {
45 return nil, fmt.Errorf("Expected list in a form of \"module:level\" pairs, given pair %s, list %s", item, list)
48 module := moduleAndLevel[0]
49 level := moduleAndLevel[1]
51 if module == defaultLogLevelKey {
52 option, err = log.AllowLevel(level)
54 return nil, errors.Wrap(err, fmt.Sprintf("Failed to parse default log level (pair %s, list %s)", item, l))
56 options = append(options, option)
57 isDefaultLogLevelSet = true
61 option = log.AllowDebugWith("module", module)
63 option = log.AllowInfoWith("module", module)
65 option = log.AllowErrorWith("module", module)
67 option = log.AllowNoneWith("module", module)
69 return nil, fmt.Errorf("Expected either \"info\", \"debug\", \"error\" or \"none\" log level, given %s (pair %s, list %s)", level, item, list)
71 options = append(options, option)
76 // if "*" is not provided, set default global level
77 if !isDefaultLogLevelSet {
78 option, err = log.AllowLevel(defaultLogLevelValue)
82 options = append(options, option)
85 return log.NewFilter(logger, options...), nil