Skip to content

Commit 7da1e00

Browse files
authored
Helper method to simplify passing Logger as io.Writer (#25)
* Make Logger comply with io.Writer Alternative to #24 * Fixed SimpleRenderer * Format message upon log entry creation * Reorder fields * Introduce AsWriter method
1 parent 3724ece commit 7da1e00

File tree

6 files changed

+48
-22
lines changed

6 files changed

+48
-22
lines changed

go.mod

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ go 1.14
44

55
require (
66
github.com/stretchr/testify v1.6.1
7-
golang.org/x/sys v0.0.0-20200817155316-9781c653f443
8-
golang.org/x/text v0.3.3
7+
golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec
8+
golang.org/x/text v0.3.7
99
)

go.sum

+4
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,12 @@ github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd
77
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
88
golang.org/x/sys v0.0.0-20200817155316-9781c653f443 h1:X18bCaipMcoJGm27Nv7zr4XYPKGUy92GtqboKC2Hxaw=
99
golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
10+
golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec h1:BkDtF2Ih9xZ7le9ndzTA7KJow28VbQW3odyk/8drmuI=
11+
golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
1012
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
1113
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
14+
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
15+
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
1216
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
1317
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
1418
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

log_entry.go

+12-10
Original file line numberDiff line numberDiff line change
@@ -52,23 +52,25 @@ func (entry *LogScopeFinished) GetScopes() []string {
5252
}
5353

5454
type LogEntryMessage struct {
55-
Level LogLevel
56-
format string
57-
arguments []interface{}
58-
scopes []string
55+
Level LogLevel
56+
scopes []string
57+
message string
58+
raw bool
5959
}
6060

61-
func NewLogEntryMessage(scopes []string, level LogLevel, format string, a ...interface{}) *LogEntryMessage {
61+
func NewLogEntryMessage(scopes []string, level LogLevel, format string, arguments ...interface{}) *LogEntryMessage {
6262
return &LogEntryMessage{
63-
Level: level,
64-
format: format,
65-
arguments: a,
66-
scopes: scopes,
63+
Level: level,
64+
scopes: scopes,
65+
message: fmt.Sprintf(format, arguments...),
6766
}
6867
}
6968

7069
func (entry *LogEntryMessage) GetMessage() string {
71-
return fmt.Sprintf(entry.format, entry.arguments...)
70+
if entry.raw {
71+
return entry.message
72+
}
73+
return entry.message + "\n"
7274
}
7375

7476
func (entry *LogEntryMessage) GetScopes() []string {

logger.go

+24-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package echelon
22

3+
import "io"
4+
35
type genericLogEntry struct {
46
LogStarted *LogScopeStarted
57
LogFinished *LogScopeFinished
@@ -13,12 +15,26 @@ type LogRendered interface {
1315
}
1416

1517
type Logger struct {
16-
level LogLevel
18+
maxLogLevel LogLevel
1719
scopes []string
1820
entriesChannel chan *genericLogEntry
1921
renderer LogRendered
2022
}
2123

24+
type loggerAsWriter struct {
25+
logger *Logger
26+
level LogLevel
27+
}
28+
29+
func (w *loggerAsWriter) Write(p []byte) (n int, err error) {
30+
if w.logger.IsLogLevelEnabled(w.level) {
31+
logEntryMessage := NewLogEntryMessage(w.logger.scopes, w.level, string(p))
32+
logEntryMessage.raw = true
33+
w.logger.entriesChannel <- &genericLogEntry{LogEntry: logEntryMessage}
34+
}
35+
return len(p), err
36+
}
37+
2238
type FinishType int
2339

2440
const (
@@ -29,7 +45,7 @@ const (
2945

3046
func NewLogger(level LogLevel, renderer LogRendered) *Logger {
3147
logger := &Logger{
32-
level: level,
48+
maxLogLevel: level,
3349
entriesChannel: make(chan *genericLogEntry),
3450
renderer: renderer,
3551
}
@@ -43,7 +59,7 @@ func (logger *Logger) Renderer() LogRendered {
4359

4460
func (logger *Logger) Scoped(scope string) *Logger {
4561
result := &Logger{
46-
level: logger.level,
62+
maxLogLevel: logger.maxLogLevel,
4763
scopes: append(logger.scopes, scope),
4864
entriesChannel: logger.entriesChannel,
4965
}
@@ -96,6 +112,10 @@ func (logger *Logger) Logf(level LogLevel, format string, args ...interface{}) {
96112
}
97113
}
98114

115+
func (logger *Logger) AsWriter(level LogLevel) io.Writer {
116+
return &loggerAsWriter{logger: logger, level: level}
117+
}
118+
99119
func (logger *Logger) Finish(success bool) {
100120
var finishType FinishType
101121

@@ -115,5 +135,5 @@ func (logger *Logger) FinishWithType(finishType FinishType) {
115135
}
116136

117137
func (logger *Logger) IsLogLevelEnabled(level LogLevel) bool {
118-
return level <= logger.level
138+
return level <= logger.maxLogLevel
119139
}

renderers/interactive.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ func (r *InteractiveRenderer) RenderScopeFinished(entry *echelon.LogScopeFinishe
7474
}
7575

7676
func (r *InteractiveRenderer) RenderMessage(entry *echelon.LogEntryMessage) {
77-
findScopedNode(entry.GetScopes(), r).AppendDescription(entry.GetMessage() + "\n")
77+
findScopedNode(entry.GetScopes(), r).AppendDescription(entry.GetMessage())
7878
}
7979

8080
func (r *InteractiveRenderer) StartDrawing() {

renderers/simple.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func (r SimpleRenderer) RenderScopeStarted(entry *echelon.LogScopeStarted) {
4646
r.startTimes[timeKey] = time.Now()
4747
lastScope := scopes[level-1]
4848
message := terminal.GetColoredText(r.colors.NeutralColor, fmt.Sprintf("Started %s", quotedIfNeeded(lastScope)))
49-
r.RenderRawMessage(message)
49+
r.RenderRawMessage(message + "\n")
5050
}
5151

5252
func (r SimpleRenderer) RenderScopeFinished(entry *echelon.LogScopeFinished) {
@@ -68,15 +68,15 @@ func (r SimpleRenderer) RenderScopeFinished(entry *echelon.LogScopeFinished) {
6868
case echelon.FinishTypeSucceeded:
6969
message := fmt.Sprintf("%s succeeded in %s!", quotedIfNeeded(lastScope), formatedDuration)
7070
coloredMessage := terminal.GetColoredText(r.colors.SuccessColor, message)
71-
r.RenderRawMessage(coloredMessage)
71+
r.RenderRawMessage(coloredMessage + "\n")
7272
case echelon.FinishTypeFailed:
7373
message := fmt.Sprintf("%s failed in %s!", quotedIfNeeded(lastScope), formatedDuration)
7474
coloredMessage := terminal.GetColoredText(r.colors.FailureColor, message)
75-
r.RenderRawMessage(coloredMessage)
75+
r.RenderRawMessage(coloredMessage + "\n")
7676
case echelon.FinishTypeSkipped:
7777
message := fmt.Sprintf("%s skipped in %s!", quotedIfNeeded(lastScope), formatedDuration)
7878
coloredMessage := terminal.GetColoredText(r.colors.NeutralColor, message)
79-
r.RenderRawMessage(coloredMessage)
79+
r.RenderRawMessage(coloredMessage + "\n")
8080
}
8181
}
8282

@@ -85,7 +85,7 @@ func (r SimpleRenderer) RenderMessage(entry *echelon.LogEntryMessage) {
8585
}
8686

8787
func (r SimpleRenderer) RenderRawMessage(message string) {
88-
_, _ = r.out.Write([]byte(message + "\n"))
88+
_, _ = r.out.Write([]byte(message))
8989
}
9090

9191
func (r SimpleRenderer) ScopeHasStarted(scopes []string) bool {

0 commit comments

Comments
 (0)