Skip to content

Commit dc6633b

Browse files
author
Triston Whetten
committed
Added support for setting logger for each log level
1 parent d7acddb commit dc6633b

File tree

5 files changed

+122
-30
lines changed

5 files changed

+122
-30
lines changed

conn.go

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,9 @@ type Conn struct {
6565

6666
delegate ConnDelegate
6767

68-
logger logger
68+
logger []logger
6969
logLvl LogLevel
70-
logFmt string
70+
logFmt []string
7171
logGuard sync.RWMutex
7272

7373
r io.Reader
@@ -103,6 +103,9 @@ func NewConn(addr string, config *Config, delegate ConnDelegate) *Conn {
103103
msgResponseChan: make(chan *msgResponse),
104104
exitChan: make(chan int),
105105
drainReady: make(chan int),
106+
107+
logger: make([]logger, LogLevelMax+1),
108+
logFmt: make([]string, LogLevelMax+1),
106109
}
107110
}
108111

@@ -122,19 +125,44 @@ func (c *Conn) SetLogger(l logger, lvl LogLevel, format string) {
122125
c.logGuard.Lock()
123126
defer c.logGuard.Unlock()
124127

125-
c.logger = l
126-
c.logLvl = lvl
127-
c.logFmt = format
128-
if c.logFmt == "" {
129-
c.logFmt = "(%s)"
128+
for level := range c.logger {
129+
c.logger[level] = l
130+
c.logFmt[level] = format
131+
if c.logFmt[level] == "" {
132+
c.logFmt[level] = "(%s)"
133+
}
130134
}
135+
c.logLvl = lvl
136+
}
137+
138+
func (c *Conn) SetLoggerForLevel(l logger, lvl LogLevel, format string) {
139+
c.logGuard.Lock()
140+
defer c.logGuard.Unlock()
141+
142+
c.logger[lvl] = l
143+
c.logFmt[lvl] = format
144+
}
145+
146+
// SetLoggerLevel sets the package logging level.
147+
func (c *Conn) SetLoggerLevel(lvl LogLevel) {
148+
c.logGuard.Lock()
149+
defer c.logGuard.Unlock()
150+
151+
c.logLvl = lvl
152+
}
153+
154+
func (c *Conn) getLogger(lvl LogLevel) (logger, LogLevel, string) {
155+
c.logGuard.RLock()
156+
defer c.logGuard.RUnlock()
157+
158+
return c.logger[lvl], c.logLvl, c.logFmt[lvl]
131159
}
132160

133-
func (c *Conn) getLogger() (logger, LogLevel, string) {
161+
func (c *Conn) getLogLevel() LogLevel {
134162
c.logGuard.RLock()
135163
defer c.logGuard.RUnlock()
136164

137-
return c.logger, c.logLvl, c.logFmt
165+
return c.logLvl
138166
}
139167

140168
// Connect dials and bootstraps the nsqd connection
@@ -718,7 +746,7 @@ func (c *Conn) onMessageTouch(m *Message) {
718746
}
719747

720748
func (c *Conn) log(lvl LogLevel, line string, args ...interface{}) {
721-
logger, logLvl, logFmt := c.getLogger()
749+
logger, logLvl, logFmt := c.getLogger(lvl)
722750

723751
if logger == nil {
724752
return

consumer.go

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ type Consumer struct {
9595

9696
mtx sync.RWMutex
9797

98-
logger logger
98+
logger []logger
9999
logLvl LogLevel
100100
logGuard sync.RWMutex
101101

@@ -166,7 +166,7 @@ func NewConsumer(topic string, channel string, config *Config) (*Consumer, error
166166
channel: channel,
167167
config: *config,
168168

169-
logger: log.New(os.Stderr, "", log.Flags()),
169+
logger: make([]logger, LogLevelMax+1),
170170
logLvl: LogLevelInfo,
171171
maxInFlight: int32(config.MaxInFlight),
172172

@@ -183,6 +183,13 @@ func NewConsumer(topic string, channel string, config *Config) (*Consumer, error
183183
StopChan: make(chan int),
184184
exitChan: make(chan int),
185185
}
186+
187+
// Set default logger for all log levels
188+
l := log.New(os.Stderr, "", log.Flags())
189+
for index := range r.logger {
190+
r.logger[index] = l
191+
}
192+
186193
r.wg.Add(1)
187194
go r.rdyLoop()
188195
return r, nil
@@ -219,22 +226,40 @@ func (r *Consumer) SetLogger(l logger, lvl LogLevel) {
219226
r.logGuard.Lock()
220227
defer r.logGuard.Unlock()
221228

222-
r.logger = l
229+
for level := range r.logger {
230+
r.logger[level] = l
231+
}
223232
r.logLvl = lvl
224233
}
225234

235+
// SetLoggerForLevel assigns the same logger for specified `level`.
236+
func (r *Consumer) SetLoggerForLevel(l logger, lvl LogLevel) {
237+
r.logGuard.Lock()
238+
defer r.logGuard.Unlock()
239+
240+
r.logger[lvl] = l
241+
}
242+
243+
// SetLoggerLevel sets the package logging level.
226244
func (r *Consumer) SetLoggerLevel(lvl LogLevel) {
227245
r.logGuard.Lock()
228246
defer r.logGuard.Unlock()
229247

230248
r.logLvl = lvl
231249
}
232250

233-
func (r *Consumer) getLogger() (logger, LogLevel) {
251+
func (r *Consumer) getLogger(lvl LogLevel) (logger, LogLevel) {
234252
r.logGuard.RLock()
235253
defer r.logGuard.RUnlock()
236254

237-
return r.logger, r.logLvl
255+
return r.logger[lvl], r.logLvl
256+
}
257+
258+
func (r *Consumer) getLogLevel() LogLevel {
259+
r.logGuard.RLock()
260+
defer r.logGuard.RUnlock()
261+
262+
return r.logLvl
238263
}
239264

240265
// SetBehaviorDelegate takes a type implementing one or more
@@ -530,12 +555,12 @@ func (r *Consumer) ConnectToNSQD(addr string) error {
530555

531556
atomic.StoreInt32(&r.connectedFlag, 1)
532557

533-
logger, logLvl := r.getLogger()
534-
535558
conn := NewConn(addr, &r.config, &consumerConnDelegate{r})
536-
conn.SetLogger(logger, logLvl,
537-
fmt.Sprintf("%3d [%s/%s] (%%s)", r.id, r.topic, r.channel))
538-
559+
conn.SetLoggerLevel(r.getLogLevel())
560+
for index := range r.logger {
561+
conn.SetLoggerForLevel(r.logger[index], LogLevel(index),
562+
fmt.Sprintf("%3d [%s/%s] (%%s)", r.id, r.topic, r.channel))
563+
}
539564
r.mtx.Lock()
540565
_, pendingOk := r.pendingConnections[addr]
541566
_, ok := r.connections[addr]
@@ -1156,7 +1181,7 @@ func (r *Consumer) exit() {
11561181
}
11571182

11581183
func (r *Consumer) log(lvl LogLevel, line string, args ...interface{}) {
1159-
logger, logLvl := r.getLogger()
1184+
logger, logLvl := r.getLogger(lvl)
11601185

11611186
if logger == nil {
11621187
return

delegates.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ const (
1515
LogLevelInfo
1616
LogLevelWarning
1717
LogLevelError
18+
LogLevelMax = iota - 1 // convenience - match highest log level
1819
)
1920

2021
// String returns the string form for a given LogLevel

producer.go

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import (
1212
type producerConn interface {
1313
String() string
1414
SetLogger(logger, LogLevel, string)
15+
SetLoggerLevel(LogLevel)
16+
SetLoggerForLevel(logger, LogLevel, string)
1517
Connect() (*IdentifyResponse, error)
1618
Close() error
1719
WriteCommand(*Command) error
@@ -28,7 +30,7 @@ type Producer struct {
2830
conn producerConn
2931
config Config
3032

31-
logger logger
33+
logger []logger
3234
logLvl LogLevel
3335
logGuard sync.RWMutex
3436

@@ -80,14 +82,20 @@ func NewProducer(addr string, config *Config) (*Producer, error) {
8082
addr: addr,
8183
config: *config,
8284

83-
logger: log.New(os.Stderr, "", log.Flags()),
85+
logger: make([]logger, int(LogLevelMax+1)),
8486
logLvl: LogLevelInfo,
8587

8688
transactionChan: make(chan *ProducerTransaction),
8789
exitChan: make(chan int),
8890
responseChan: make(chan []byte),
8991
errorChan: make(chan []byte),
9092
}
93+
94+
// Set default logger for all log levels
95+
l := log.New(os.Stderr, "", log.Flags())
96+
for index, _ := range p.logger {
97+
p.logger[index] = l
98+
}
9199
return p, nil
92100
}
93101

@@ -119,15 +127,40 @@ func (w *Producer) SetLogger(l logger, lvl LogLevel) {
119127
w.logGuard.Lock()
120128
defer w.logGuard.Unlock()
121129

122-
w.logger = l
130+
for level := range w.logger {
131+
w.logger[level] = l
132+
}
123133
w.logLvl = lvl
124134
}
125135

126-
func (w *Producer) getLogger() (logger, LogLevel) {
136+
// SetLoggerForLevel assigns the same logger for specified `level`.
137+
func (w *Producer) SetLoggerForLevel(l logger, lvl LogLevel) {
138+
w.logGuard.Lock()
139+
defer w.logGuard.Unlock()
140+
141+
w.logger[lvl] = l
142+
}
143+
144+
// SetLoggerLevel sets the package logging level.
145+
func (w *Producer) SetLoggerLevel(lvl LogLevel) {
146+
w.logGuard.Lock()
147+
defer w.logGuard.Unlock()
148+
149+
w.logLvl = lvl
150+
}
151+
152+
func (w *Producer) getLogger(lvl LogLevel) (logger, LogLevel) {
153+
w.logGuard.RLock()
154+
defer w.logGuard.RUnlock()
155+
156+
return w.logger[lvl], w.logLvl
157+
}
158+
159+
func (w *Producer) getLogLevel() LogLevel {
127160
w.logGuard.RLock()
128161
defer w.logGuard.RUnlock()
129162

130-
return w.logger, w.logLvl
163+
return w.logLvl
131164
}
132165

133166
// String returns the address of the Producer
@@ -273,10 +306,11 @@ func (w *Producer) connect() error {
273306

274307
w.log(LogLevelInfo, "(%s) connecting to nsqd", w.addr)
275308

276-
logger, logLvl := w.getLogger()
277-
278309
w.conn = NewConn(w.addr, &w.config, &producerConnDelegate{w})
279-
w.conn.SetLogger(logger, logLvl, fmt.Sprintf("%3d (%%s)", w.id))
310+
w.conn.SetLoggerLevel(w.getLogLevel())
311+
for index := range w.logger {
312+
w.conn.SetLoggerForLevel(w.logger[index], LogLevel(index), fmt.Sprintf("%3d (%%s)", w.id))
313+
}
280314

281315
_, err := w.conn.Connect()
282316
if err != nil {
@@ -369,7 +403,7 @@ func (w *Producer) transactionCleanup() {
369403
}
370404

371405
func (w *Producer) log(lvl LogLevel, line string, args ...interface{}) {
372-
logger, logLvl := w.getLogger()
406+
logger, logLvl := w.getLogger(lvl)
373407

374408
if logger == nil {
375409
return

producer_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,10 @@ func (m *mockProducerConn) String() string {
305305

306306
func (m *mockProducerConn) SetLogger(logger logger, level LogLevel, prefix string) {}
307307

308+
func (m *mockProducerConn) SetLoggerLevel(lvl LogLevel) {}
309+
310+
func (m *mockProducerConn) SetLoggerForLevel(logger logger, level LogLevel, format string) {}
311+
308312
func (m *mockProducerConn) Connect() (*IdentifyResponse, error) {
309313
return &IdentifyResponse{}, nil
310314
}

0 commit comments

Comments
 (0)