Skip to content

Commit ad5ed66

Browse files
committed
internal/lg: make LogLevel a flag.Value; refactor
1 parent c888ddd commit ad5ed66

File tree

4 files changed

+35
-95
lines changed

4 files changed

+35
-95
lines changed

internal/app/float_array.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import (
1010

1111
type FloatArray []float64
1212

13+
func (a *FloatArray) Get() interface{} { return []float64(*a) }
14+
1315
func (a *FloatArray) Set(param string) error {
1416
for _, s := range strings.Split(param, ",") {
1517
v, err := strconv.ParseFloat(s, 64)

internal/app/string_array.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import (
66

77
type StringArray []string
88

9+
func (a *StringArray) Get() interface{} { return []string(*a) }
10+
911
func (a *StringArray) Set(s string) error {
1012
*a = append(*a, s)
1113
return nil

internal/lg/lg.go

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ import (
88
"strings"
99
)
1010

11-
type LogLevel int
12-
1311
const (
1412
DEBUG = LogLevel(1)
1513
INFO = LogLevel(2)
@@ -30,43 +28,49 @@ func (l NilLogger) Output(maxdepth int, s string) error {
3028
return nil
3129
}
3230

33-
func (l LogLevel) String() string {
34-
switch l {
35-
case 1:
31+
type LogLevel int
32+
33+
func (l *LogLevel) Get() interface{} { return *l }
34+
35+
func (l *LogLevel) Set(s string) error {
36+
lvl, err := ParseLogLevel(s)
37+
if err != nil {
38+
return err
39+
}
40+
*l = lvl
41+
return nil
42+
}
43+
44+
func (l *LogLevel) String() string {
45+
switch *l {
46+
case DEBUG:
3647
return "DEBUG"
37-
case 2:
48+
case INFO:
3849
return "INFO"
39-
case 3:
50+
case WARN:
4051
return "WARNING"
41-
case 4:
52+
case ERROR:
4253
return "ERROR"
43-
case 5:
54+
case FATAL:
4455
return "FATAL"
4556
}
46-
panic("invalid LogLevel")
57+
return "invalid"
4758
}
4859

49-
func ParseLogLevel(levelstr string, verbose bool) (LogLevel, error) {
50-
lvl := INFO
51-
60+
func ParseLogLevel(levelstr string) (LogLevel, error) {
5261
switch strings.ToLower(levelstr) {
5362
case "debug":
54-
lvl = DEBUG
63+
return DEBUG, nil
5564
case "info":
56-
lvl = INFO
65+
return INFO, nil
5766
case "warn":
58-
lvl = WARN
67+
return WARN, nil
5968
case "error":
60-
lvl = ERROR
69+
return ERROR, nil
6170
case "fatal":
62-
lvl = FATAL
63-
default:
64-
return lvl, fmt.Errorf("invalid log-level '%s'", levelstr)
65-
}
66-
if verbose {
67-
lvl = DEBUG
71+
return FATAL, nil
6872
}
69-
return lvl, nil
73+
return 0, fmt.Errorf("invalid log level '%s' (debug, info, warn, error, fatal)", levelstr)
7074
}
7175

7276
func Logf(logger Logger, cfgLevel LogLevel, msgLevel LogLevel, f string, args ...interface{}) {

internal/lg/lg_test.go

Lines changed: 3 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,11 @@
11
package lg
22

33
import (
4-
"log"
5-
"os"
64
"testing"
75

86
"github.com/nsqio/nsq/internal/test"
97
)
108

11-
type options struct {
12-
LogLevel string `flag:"log-level"`
13-
Verbose bool `flag:"verbose"` // for backwards compatibility
14-
Logger Logger
15-
logLevel LogLevel // private, not really an option
16-
}
17-
18-
func newOptions() *options {
19-
return &options{
20-
LogLevel: "info",
21-
}
22-
}
23-
24-
type app struct {
25-
opts *options
26-
}
27-
28-
func (n *app) logf(level LogLevel, f string, args ...interface{}) {
29-
Logf(n.opts.Logger, n.opts.logLevel, level, f, args)
30-
}
31-
32-
func newApp(opts *options) *app {
33-
if opts.Logger == nil {
34-
opts.Logger = log.New(os.Stderr, "[app] ", log.Ldate|log.Ltime|log.Lmicroseconds)
35-
}
36-
n := &app{
37-
opts: opts,
38-
}
39-
40-
var err error
41-
opts.logLevel, err = ParseLogLevel(opts.LogLevel, opts.Verbose)
42-
if err != nil {
43-
n.logf(FATAL, "%s", err)
44-
os.Exit(1)
45-
}
46-
47-
n.logf(INFO, "app 0.1")
48-
return n
49-
}
50-
519
type mockLogger struct {
5210
Count int
5311
}
@@ -59,51 +17,25 @@ func (l *mockLogger) Output(maxdepth int, s string) error {
5917

6018
func TestLogging(t *testing.T) {
6119
logger := &mockLogger{}
62-
opts := newOptions()
63-
opts.Logger = logger
6420

6521
// Test only fatal get through
66-
opts.LogLevel = "FaTaL"
67-
nsqd := newApp(opts)
6822
logger.Count = 0
6923
for i := 1; i <= 5; i++ {
70-
nsqd.logf(LogLevel(i), "Test")
24+
Logf(logger, FATAL, LogLevel(i), "Test")
7125
}
7226
test.Equal(t, 1, logger.Count)
7327

7428
// Test only warnings or higher get through
75-
opts.LogLevel = "WARN"
76-
nsqd = newApp(opts)
7729
logger.Count = 0
7830
for i := 1; i <= 5; i++ {
79-
nsqd.logf(LogLevel(i), "Test")
31+
Logf(logger, WARN, LogLevel(i), "Test")
8032
}
8133
test.Equal(t, 3, logger.Count)
8234

8335
// Test everything gets through
84-
opts.LogLevel = "debuG"
85-
nsqd = newApp(opts)
86-
logger.Count = 0
87-
for i := 1; i <= 5; i++ {
88-
nsqd.logf(LogLevel(i), "Test")
89-
}
90-
test.Equal(t, 5, logger.Count)
91-
92-
// Test everything gets through with verbose = true
93-
opts.LogLevel = "fatal"
94-
opts.Verbose = true
95-
nsqd = newApp(opts)
9636
logger.Count = 0
9737
for i := 1; i <= 5; i++ {
98-
nsqd.logf(LogLevel(i), "Test")
38+
Logf(logger, DEBUG, LogLevel(i), "Test")
9939
}
10040
test.Equal(t, 5, logger.Count)
10141
}
102-
103-
func TestNoLogger(t *testing.T) {
104-
opts := newOptions()
105-
opts.Logger = NilLogger{}
106-
app := newApp(opts)
107-
108-
app.logf(ERROR, "should never be logged")
109-
}

0 commit comments

Comments
 (0)