OSDN Git Service

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