Skip to content

Commit 1ac2835

Browse files
committed
set level method, improvements and optimization
1 parent 0c65b4b commit 1ac2835

File tree

4 files changed

+74
-102
lines changed

4 files changed

+74
-102
lines changed

default.go

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// Copyright (c) 2016 Jeevanandam M (https://github.com/jeevatkm)
2-
// resty source code and usage is governed by a MIT style
2+
// go-aah/log source code and usage is governed by a MIT style
33
// license that can be found in the LICENSE file.
44

55
package log
@@ -8,52 +8,52 @@ var stdLogger Logger
88

99
// Error logs message as `LevelError`
1010
func Error(v ...interface{}) {
11-
stdLogger.Error(v...)
11+
_ = stdLogger.Output(LevelError, 2, nil, v...)
1212
}
1313

1414
// Errorf logs message as `LevelError`
1515
func Errorf(format string, v ...interface{}) {
16-
stdLogger.Errorf(format, v...)
16+
_ = stdLogger.Output(LevelError, 2, &format, v...)
1717
}
1818

1919
// Warn logs message as `LevelWarn`
2020
func Warn(v ...interface{}) {
21-
stdLogger.Warn(v...)
21+
_ = stdLogger.Output(LevelWarn, 2, nil, v...)
2222
}
2323

2424
// Warnf logs message as `LevelWarn`
2525
func Warnf(format string, v ...interface{}) {
26-
stdLogger.Warnf(format, v...)
26+
_ = stdLogger.Output(LevelWarn, 2, &format, v...)
2727
}
2828

2929
// Info logs message as `LevelInfo`
3030
func Info(v ...interface{}) {
31-
stdLogger.Info(v...)
31+
_ = stdLogger.Output(LevelInfo, 2, nil, v...)
3232
}
3333

3434
// Infof logs message as `LevelInfo`
3535
func Infof(format string, v ...interface{}) {
36-
stdLogger.Infof(format, v...)
36+
_ = stdLogger.Output(LevelInfo, 2, &format, v...)
3737
}
3838

3939
// Debug logs message as `LevelDebug`
4040
func Debug(v ...interface{}) {
41-
stdLogger.Debug(v...)
41+
_ = stdLogger.Output(LevelDebug, 2, nil, v...)
4242
}
4343

4444
// Debugf logs message as `LevelDebug`
4545
func Debugf(format string, v ...interface{}) {
46-
stdLogger.Debugf(format, v...)
46+
_ = stdLogger.Output(LevelDebug, 2, &format, v...)
4747
}
4848

4949
// Trace logs message as `LevelTrace`
5050
func Trace(v ...interface{}) {
51-
stdLogger.Trace(v...)
51+
_ = stdLogger.Output(LevelTrace, 2, nil, v...)
5252
}
5353

5454
// Tracef logs message as `LevelTrace`
5555
func Tracef(format string, v ...interface{}) {
56-
stdLogger.Tracef(format, v...)
56+
_ = stdLogger.Output(LevelTrace, 2, &format, v...)
5757
}
5858

5959
// Stats returns current logger statistics like number of lines written,
@@ -67,6 +67,11 @@ func SetPattern(pattern string) error {
6767
return stdLogger.SetPattern(pattern)
6868
}
6969

70+
// SetLevel allows to set log level dynamically
71+
func SetLevel(level Level) {
72+
stdLogger.SetLevel(level)
73+
}
74+
7075
func init() {
7176
stdLogger, _ = New(`receiver = "CONSOLE"; level = "DEBUG";`)
7277
}

formatter.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
// Copyright (c) 2016 Jeevanandam M (https://github.com/jeevatkm)
2-
// resty source code and usage is governed by a MIT style
2+
// go-aah/log source code and usage is governed by a MIT style
33
// license that can be found in the LICENSE file.
44

55
package log
66

77
import (
88
"fmt"
9-
"strconv"
109
"strings"
1110

1211
"github.com/go-aah/essentials"
@@ -58,6 +57,9 @@ func parseFlag(format string) (*[]FlagPart, error) {
5857
}
5958
default:
6059
part.Format = defaultFormat
60+
if flag == FmtFlagLine {
61+
part.Format = "L" + defaultFormat
62+
}
6163
}
6264

6365
flagParts = append(flagParts, part)
@@ -92,12 +94,12 @@ func DefaultFormatter(flags *[]FlagPart, entry *Entry, isColor bool) (*[]byte, e
9294
}
9395
buf = append(buf, fmt.Sprintf(part.Format, entry.File)...)
9496
case FmtFlagLine:
95-
buf = append(buf, fmt.Sprintf(part.Format, "L"+strconv.Itoa(entry.Line))...)
97+
buf = append(buf, fmt.Sprintf(part.Format, entry.Line)...)
9698
case FmtFlagMessage:
97-
if ess.StrIsEmpty(entry.Format) {
98-
buf = append(buf, fmt.Sprint(entry.Values...)...)
99+
if entry.Format == nil {
100+
buf = append(buf, fmt.Sprint(*entry.Values...)...)
99101
} else {
100-
buf = append(buf, fmt.Sprintf(entry.Format, entry.Values...)...)
102+
buf = append(buf, fmt.Sprintf(*entry.Format, *entry.Values...)...)
101103
}
102104
case FmtFlagCustom:
103105
buf = append(buf, part.Format...)

log.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -133,16 +133,16 @@ var (
133133
type Entry struct {
134134
Level Level
135135
Time time.Time
136-
Format string
137-
Values []interface{}
136+
Format *string
137+
Values *[]interface{}
138138
File string
139139
Line int
140140
}
141141

142142
// Logger is interface for `aah/log` package
143143
type Logger interface {
144144
// Output writes the entry data into receiver
145-
Output(entry *Entry) error
145+
Output(level Level, calldepth int, format *string, v ...interface{}) error
146146

147147
// Close closes the log writer. It cannot be used after this operation
148148
Close()
@@ -157,6 +157,9 @@ type Logger interface {
157157
// SetPattern sets the log entry format
158158
SetPattern(pattern string) error
159159

160+
// SetLevel allows to set log level dynamically
161+
SetLevel(level Level)
162+
160163
Error(v ...interface{})
161164
Errorf(format string, v ...interface{})
162165

@@ -240,7 +243,7 @@ func levelByName(name string) Level {
240243
}
241244

242245
func fetchCallerInfo(calldepth int) (string, int) {
243-
_, file, line, ok := runtime.Caller(calldepth)
246+
_, file, line, ok := runtime.Caller(calldepth + 1)
244247
if !ok {
245248
file = "???"
246249
line = 0

receiver.go

Lines changed: 43 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,23 @@ type Receiver struct {
4747
}
4848

4949
// Output formats the give log inputs, caller info and writes to console
50-
func (r *Receiver) Output(entry *Entry) error {
50+
func (r *Receiver) Output(level Level, calldepth int, format *string, v ...interface{}) error {
51+
if level > r.level {
52+
return nil
53+
}
54+
55+
now := time.Now() // get this early
56+
5157
if r.Closed() {
5258
return ErrWriterIsClosed
5359
}
5460

61+
var (
62+
file string
63+
line int
64+
)
5565
if r.isFileInfo || r.isLineInfo {
56-
entry.File, entry.Line = fetchCallerInfo(3)
66+
file, line = fetchCallerInfo(calldepth)
5767
}
5868

5969
r.m.Lock()
@@ -66,6 +76,15 @@ func (r *Receiver) Output(entry *Entry) error {
6676
}
6777
}
6878

79+
entry := &Entry{
80+
Level: level,
81+
Time: now,
82+
Format: format,
83+
Values: &v,
84+
File: file,
85+
Line: line,
86+
}
87+
6988
// format the log entry message as per pattern
7089
buf, err := r.Format(r.Flags, entry, r.isColor)
7190
if err != nil {
@@ -79,10 +98,8 @@ func (r *Receiver) Output(entry *Entry) error {
7998
}
8099

81100
// calculate receiver stats
82-
if r.stats != nil {
83-
r.stats.bytes += int64(size)
84-
r.stats.lines++
85-
}
101+
r.stats.bytes += int64(size)
102+
r.stats.lines++
86103

87104
return nil
88105
}
@@ -119,127 +136,72 @@ func (r *Receiver) SetPattern(pattern string) error {
119136
return err
120137
}
121138
r.Flags = flags
139+
r.isFileInfo = isFileFlagExists(flags)
140+
r.isLineInfo = isFmtFlagExists(flags, FmtFlagLine)
141+
r.isUTC = isFmtFlagExists(flags, FmtFlagUTCTime)
122142

123143
return nil
124144
}
125145

146+
// SetLevel allows to set log level dyamically
147+
func (r *Receiver) SetLevel(level Level) {
148+
r.m.Lock()
149+
defer r.m.Unlock()
150+
r.level = level
151+
}
152+
126153
func (r *Receiver) isFileReceiver() bool {
127154
return r.Type == "FILE"
128155
}
129156

130157
// Error logs message as `LevelError`
131158
func (r *Receiver) Error(v ...interface{}) {
132-
if r.level >= LevelError {
133-
_ = r.Output(&Entry{
134-
Time: time.Now(),
135-
Level: LevelError,
136-
Values: v,
137-
})
138-
}
159+
_ = r.Output(LevelError, 2, nil, v...)
139160
}
140161

141162
// Errorf logs message as `LevelError`
142163
func (r *Receiver) Errorf(format string, v ...interface{}) {
143-
if r.level >= LevelError {
144-
_ = r.Output(&Entry{
145-
Time: time.Now(),
146-
Level: LevelError,
147-
Format: format,
148-
Values: v,
149-
})
150-
}
164+
_ = r.Output(LevelError, 2, &format, v...)
151165
}
152166

153167
// Warn logs message as `LevelWarn`
154168
func (r *Receiver) Warn(v ...interface{}) {
155-
if r.level >= LevelWarn {
156-
_ = r.Output(&Entry{
157-
Time: time.Now(),
158-
Level: LevelWarn,
159-
Values: v,
160-
})
161-
}
169+
_ = r.Output(LevelWarn, 2, nil, v...)
162170
}
163171

164172
// Warnf logs message as `LevelWarn`
165173
func (r *Receiver) Warnf(format string, v ...interface{}) {
166-
if r.level >= LevelWarn {
167-
_ = r.Output(&Entry{
168-
Time: time.Now(),
169-
Level: LevelWarn,
170-
Format: format,
171-
Values: v,
172-
})
173-
}
174+
_ = r.Output(LevelWarn, 2, &format, v...)
174175
}
175176

176177
// Info logs message as `LevelInfo`
177178
func (r *Receiver) Info(v ...interface{}) {
178-
if r.level >= LevelInfo {
179-
_ = r.Output(&Entry{
180-
Time: time.Now(),
181-
Level: LevelInfo,
182-
Values: v,
183-
})
184-
}
179+
_ = r.Output(LevelInfo, 2, nil, v...)
185180
}
186181

187182
// Infof logs message as `LevelInfo`
188183
func (r *Receiver) Infof(format string, v ...interface{}) {
189-
if r.level >= LevelInfo {
190-
_ = r.Output(&Entry{
191-
Time: time.Now(),
192-
Level: LevelInfo,
193-
Format: format,
194-
Values: v,
195-
})
196-
}
184+
_ = r.Output(LevelInfo, 2, &format, v...)
197185
}
198186

199187
// Debug logs message as `LevelDebug`
200188
func (r *Receiver) Debug(v ...interface{}) {
201-
if r.level >= LevelDebug {
202-
_ = r.Output(&Entry{
203-
Time: time.Now(),
204-
Level: LevelDebug,
205-
Values: v,
206-
})
207-
}
189+
_ = r.Output(LevelDebug, 2, nil, v...)
208190
}
209191

210192
// Debugf logs message as `LevelDebug`
211193
func (r *Receiver) Debugf(format string, v ...interface{}) {
212-
if r.level >= LevelDebug {
213-
_ = r.Output(&Entry{
214-
Time: time.Now(),
215-
Level: LevelDebug,
216-
Format: format,
217-
Values: v,
218-
})
219-
}
194+
_ = r.Output(LevelDebug, 2, &format, v...)
220195
}
221196

222197
// Trace logs message as `LevelTrace`
223198
func (r *Receiver) Trace(v ...interface{}) {
224-
if r.level >= LevelTrace {
225-
_ = r.Output(&Entry{
226-
Time: time.Now(),
227-
Level: LevelTrace,
228-
Values: v,
229-
})
230-
}
199+
_ = r.Output(LevelTrace, 2, nil, v...)
231200
}
232201

233202
// Tracef logs message as `LevelTrace`
234203
func (r *Receiver) Tracef(format string, v ...interface{}) {
235-
if r.level >= LevelTrace {
236-
_ = r.Output(&Entry{
237-
Time: time.Now(),
238-
Level: LevelTrace,
239-
Format: format,
240-
Values: v,
241-
})
242-
}
204+
_ = r.Output(LevelTrace, 2, &format, v...)
243205
}
244206

245207
// unexported methods

0 commit comments

Comments
 (0)