Skip to content

Commit 11fbf0f

Browse files
committed
text_formatter: fix race
1 parent 1726e17 commit 11fbf0f

File tree

3 files changed

+12
-6
lines changed

3 files changed

+12
-6
lines changed

examples/basic/basic.go

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package main
22

33
import (
44
"github.com/Sirupsen/logrus"
5+
"os"
56
)
67

78
var log = logrus.New()

formatter_bench_test.go

+3
Original file line numberDiff line numberDiff line change
@@ -80,11 +80,14 @@ func BenchmarkLargeJSONFormatter(b *testing.B) {
8080
}
8181

8282
func doBenchmark(b *testing.B, formatter Formatter, fields Fields) {
83+
logger := New()
84+
8385
entry := &Entry{
8486
Time: time.Time{},
8587
Level: InfoLevel,
8688
Message: "message",
8789
Data: fields,
90+
Logger: logger,
8891
}
8992
var d []byte
9093
var err error

text_formatter.go

+8-6
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"sort"
77
"strings"
8+
"sync"
89
"time"
910
)
1011

@@ -49,8 +50,8 @@ type TextFormatter struct {
4950
DisableSorting bool
5051

5152
// Whether the logger's out is to a terminal
52-
isTerminal bool
53-
terminalDetermined bool
53+
isTerminal bool
54+
terminalOnce sync.Once
5455
}
5556

5657
func (f *TextFormatter) Format(entry *Entry) ([]byte, error) {
@@ -71,10 +72,11 @@ func (f *TextFormatter) Format(entry *Entry) ([]byte, error) {
7172

7273
prefixFieldClashes(entry.Data)
7374

74-
if !f.terminalDetermined {
75-
f.isTerminal = IsTerminal(entry.Logger.Out)
76-
f.terminalDetermined = true
77-
}
75+
f.terminalOnce.Do(func() {
76+
if entry.Logger != nil {
77+
f.isTerminal = IsTerminal(entry.Logger.Out)
78+
}
79+
})
7880

7981
isColored := (f.ForceColors || f.isTerminal) && !f.DisableColors
8082

0 commit comments

Comments
 (0)