Skip to content

Commit 187d7c4

Browse files
Add conditional context and color on default formatter (#75)
* Add conditional context and color on default formatter * fix test
1 parent 13ed500 commit 187d7c4

File tree

2 files changed

+84
-7
lines changed

2 files changed

+84
-7
lines changed

formatter/default.go

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,23 @@ import (
66
"github.com/gol4ng/logger"
77
)
88

9+
var falseCondition = func(entry logger.Entry) bool {
10+
return false
11+
}
12+
913
// DefaultFormatter is the default Entry formatter
1014
type DefaultFormatter struct {
11-
colored bool
12-
displayContext bool
15+
colored func(entry logger.Entry) bool
16+
displayContext func(entry logger.Entry) bool
1317
}
1418

1519
// Format will return Entry as string
1620
func (n *DefaultFormatter) Format(entry logger.Entry) string {
21+
n.init()
1722
builder := &strings.Builder{}
1823

19-
if n.colored {
24+
colored := n.colored(entry)
25+
if colored {
2026
switch entry.Level {
2127
case logger.DebugLevel:
2228
builder.WriteString("\x1b[1;36m")
@@ -40,20 +46,29 @@ func (n *DefaultFormatter) Format(entry logger.Entry) string {
4046
builder.WriteString("<")
4147
builder.WriteString(entry.Level.String())
4248
builder.WriteString(">")
43-
if n.colored {
49+
if colored {
4450
builder.WriteString("\x1b[m")
4551
}
4652
if entry.Message != "" {
4753
builder.WriteString(" ")
4854
builder.WriteString(entry.Message)
4955
}
50-
if n.displayContext && entry.Context != nil {
56+
if entry.Context != nil && n.displayContext(entry) {
5157
builder.WriteString(" ")
5258
ContextToJSON(entry.Context, builder)
5359
}
5460
return builder.String()
5561
}
5662

63+
func (n *DefaultFormatter) init() {
64+
if n.colored == nil {
65+
n.colored = falseCondition
66+
}
67+
if n.displayContext == nil {
68+
n.displayContext = falseCondition
69+
}
70+
}
71+
5772
// NewDefaultFormatter will create a new DefaultFormatter
5873
func NewDefaultFormatter(options ...Option) *DefaultFormatter {
5974
f := &DefaultFormatter{}
@@ -68,14 +83,28 @@ type Option func(*DefaultFormatter)
6883

6984
// WithColor function will enable ANSI colored formatting
7085
func WithColor(enable bool) Option {
86+
return WithConditionalColor(func(_ logger.Entry) bool {
87+
return enable
88+
})
89+
}
90+
91+
// WithConditionalColor function will enable ANSI colored formatting
92+
func WithConditionalColor(conditional func(_ logger.Entry) bool) Option {
7193
return func(formatter *DefaultFormatter) {
72-
formatter.colored = enable
94+
formatter.colored = conditional
7395
}
7496
}
7597

7698
// WithContext function will display context printing
7799
func WithContext(enable bool) Option {
100+
return WithConditionalContext(func(_ logger.Entry) bool {
101+
return enable
102+
})
103+
}
104+
105+
// WithConditionalContext function will display context printing
106+
func WithConditionalContext(conditional func(_ logger.Entry) bool) Option {
78107
return func(formatter *DefaultFormatter) {
79-
formatter.displayContext = enable
108+
formatter.displayContext = conditional
80109
}
81110
}

formatter/default_test.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,54 @@ func TestDefaultFormatter_Format_AllColor(t *testing.T) {
6868
}
6969
}
7070

71+
func TestDefaultFormatter_Format_ConditionalColor(t *testing.T) {
72+
tests := []struct {
73+
level logger.Level
74+
expected string
75+
}{
76+
{level: logger.EmergencyLevel, expected: "\x1b[1;37;41m<emergency>\x1b[m my message"},
77+
{level: logger.AlertLevel, expected: "\x1b[1;30;43m<alert>\x1b[m my message"},
78+
{level: logger.CriticalLevel, expected: "\x1b[1;30;47m<critical>\x1b[m my message"},
79+
{level: logger.ErrorLevel, expected: "\x1b[1;31m<error>\x1b[m my message"},
80+
{level: logger.WarningLevel, expected: "\x1b[1;33m<warning>\x1b[m my message"},
81+
{level: logger.NoticeLevel, expected: "<notice> my message"},
82+
{level: logger.InfoLevel, expected: "<info> my message"},
83+
{level: logger.DebugLevel, expected: "<debug> my message"},
84+
}
85+
defaultFormatter := formatter.NewDefaultFormatter(formatter.WithConditionalColor(func(e logger.Entry) bool {
86+
return e.Level <= logger.WarningLevel
87+
}))
88+
for _, tt := range tests {
89+
t.Run(tt.level.String(), func(t *testing.T) {
90+
assert.Equal(t, tt.expected, defaultFormatter.Format(logger.Entry{Level: tt.level, Message: "my message"}))
91+
})
92+
}
93+
}
94+
95+
func TestDefaultFormatter_Format_ConditionalContext(t *testing.T) {
96+
tests := []struct {
97+
level logger.Level
98+
expected string
99+
}{
100+
{level: logger.EmergencyLevel, expected: `<emergency> my message {"my_name":"my value"}`},
101+
{level: logger.AlertLevel, expected: `<alert> my message {"my_name":"my value"}`},
102+
{level: logger.CriticalLevel, expected: `<critical> my message {"my_name":"my value"}`},
103+
{level: logger.ErrorLevel, expected: `<error> my message {"my_name":"my value"}`},
104+
{level: logger.WarningLevel, expected: `<warning> my message {"my_name":"my value"}`},
105+
{level: logger.NoticeLevel, expected: "<notice> my message"},
106+
{level: logger.InfoLevel, expected: "<info> my message"},
107+
{level: logger.DebugLevel, expected: "<debug> my message"},
108+
}
109+
defaultFormatter := formatter.NewDefaultFormatter(formatter.WithConditionalContext(func(e logger.Entry) bool {
110+
return e.Level <= logger.WarningLevel
111+
}))
112+
for _, tt := range tests {
113+
t.Run(tt.level.String(), func(t *testing.T) {
114+
assert.Equal(t, tt.expected, defaultFormatter.Format(logger.Entry{Level: tt.level, Message: "my message", Context: logger.Ctx("my_name", "my value")}))
115+
})
116+
}
117+
}
118+
71119
// =====================================================================================================================
72120
// ================================================= EXAMPLES ==========================================================
73121
// =====================================================================================================================

0 commit comments

Comments
 (0)