Skip to content

Commit

Permalink
[DefaultFormatter] Add colored and with context option (#56)
Browse files Browse the repository at this point in the history
* [DefaultFormatter] Add colored and with context option

* go mod tidy
  • Loading branch information
instabledesign authored Dec 26, 2019
1 parent c4583c9 commit 393206f
Show file tree
Hide file tree
Showing 6 changed files with 120 additions and 20 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ import (

func main(){
// logger will print on STDOUT with default line format
l := logger.NewLogger(handler.Stream(os.Stdout, formatter.NewDefaultFormatter()))
l := logger.NewLogger(handler.Stream(os.Stdout, formatter.NewDefaultFormatter(formatter.DisplayContext)))

l.Debug("Go debug informations", logger.Ctx("go_os", runtime.GOOS).Add("go_arch", runtime.GOARCH))
// <debug> MyExample message {"go_arch":"amd64","go_os":"darwin"}
Expand Down
60 changes: 53 additions & 7 deletions formatter/default.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,24 +7,70 @@ import (
)

// DefaultFormatter is the default Entry formatter
type DefaultFormatter struct{}
type DefaultFormatter struct {
colored bool
displayContext bool
}

// Format will return Entry as string
func (n *DefaultFormatter) Format(entry logger.Entry) string {
builder := &strings.Builder{}

if n.colored {
switch entry.Level {
case logger.DebugLevel:
builder.WriteString("\x1b[1;36m")
case logger.InfoLevel:
builder.WriteString("\x1b[1;32m")
case logger.NoticeLevel:
builder.WriteString("\x1b[1;34m")
case logger.WarningLevel:
builder.WriteString("\x1b[1;33m")
case logger.ErrorLevel:
builder.WriteString("\x1b[1;31m")
case logger.CriticalLevel:
builder.WriteString("\x1b[1;30;47m")
case logger.AlertLevel:
builder.WriteString("\x1b[1;30;43m")
case logger.EmergencyLevel:
builder.WriteString("\x1b[1;37;41m")
}
}

builder.WriteString("<")
builder.WriteString(entry.Level.String())
builder.WriteString("> ")
builder.WriteString(entry.Message)
if entry.Context != nil {
builder.WriteString(">")
if n.colored {
builder.WriteString("\x1b[m")
}
if entry.Message != "" {
builder.WriteString(" ")
builder.WriteString(entry.Message)
}
if n.displayContext && entry.Context != nil {
builder.WriteString(" ")
ContextToJSON(entry.Context, builder)
}

return builder.String()
}

// NewDefaultFormatter will create a new DefaultFormatter
func NewDefaultFormatter() *DefaultFormatter {
return &DefaultFormatter{}
func NewDefaultFormatter(options ...option) *DefaultFormatter {
f := &DefaultFormatter{}
for _, option := range options {
option(f)
}
return f
}

type option func(*DefaultFormatter)

// EnableColor function will enable ANSI colored formatting
func EnableColor(formatter *DefaultFormatter) {
formatter.colored = true
}

// DisplayContext function will display context printing
func DisplayContext(formatter *DefaultFormatter) {
formatter.displayContext = true
}
49 changes: 44 additions & 5 deletions formatter/default_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,26 @@ func TestDefaultFormatter_Format(t *testing.T) {
entry logger.Entry
expected string
}{
{name: "test default formatter struct", formatter: &formatter.DefaultFormatter{}, entry: logger.Entry{}, expected: "<emergency> "},
{name: "test NewDefaultFormatter()", formatter: formatter.NewDefaultFormatter(), entry: logger.Entry{}, expected: "<emergency> "},
{name: "test NewDefaultFormatter()", formatter: formatter.NewDefaultFormatter(), entry: logger.Entry{Message: "my message", Level: logger.DebugLevel, Context: logger.Ctx("my_key", "my_value")}, expected: "<debug> my message {\"my_key\":\"my_value\"}"},
{name: "test default formatter struct", formatter: &formatter.DefaultFormatter{}, entry: logger.Entry{}, expected: "<emergency>"},
{name: "test NewDefaultFormatter()", formatter: formatter.NewDefaultFormatter(), entry: logger.Entry{}, expected: "<emergency>"},
{
name: "test NewDefaultFormatter(formatter.DisplayContext)",
formatter: formatter.NewDefaultFormatter(formatter.DisplayContext),
entry: logger.Entry{Message: "my message", Level: logger.DebugLevel, Context: logger.Ctx("my_key", "my_value")},
expected: "<debug> my message {\"my_key\":\"my_value\"}",
},
{
name: "test formatter.NewDefaultFormatter(formatter.EnableColor)",
formatter: formatter.NewDefaultFormatter(formatter.EnableColor),
entry: logger.Entry{Message: "my message", Level: logger.DebugLevel, Context: logger.Ctx("my_key", "my_value")},
expected: "\x1b[1;36m<debug>\x1b[m my message",
},
{
name: "test formatter.NewDefaultFormatter(formatter.EnableColor, formatter.DisplayContext)",
formatter: formatter.NewDefaultFormatter(formatter.EnableColor, formatter.DisplayContext),
entry: logger.Entry{Message: "my message", Level: logger.DebugLevel, Context: logger.Ctx("my_key", "my_value")},
expected: "\x1b[1;36m<debug>\x1b[m my message {\"my_key\":\"my_value\"}",
},
}

for _, tt := range tests {
Expand All @@ -29,17 +46,39 @@ func TestDefaultFormatter_Format(t *testing.T) {
}
}

func TestDefaultFormatter_Format_AllColor(t *testing.T) {
tests := []struct {
level logger.Level
expected string
}{
{level: logger.EmergencyLevel, expected: "\x1b[1;37;41m<emergency>\x1b[m my message"},
{level: logger.AlertLevel, expected: "\x1b[1;30;43m<alert>\x1b[m my message"},
{level: logger.CriticalLevel, expected: "\x1b[1;30;47m<critical>\x1b[m my message"},
{level: logger.ErrorLevel, expected: "\x1b[1;31m<error>\x1b[m my message"},
{level: logger.WarningLevel, expected: "\x1b[1;33m<warning>\x1b[m my message"},
{level: logger.NoticeLevel, expected: "\x1b[1;34m<notice>\x1b[m my message"},
{level: logger.InfoLevel, expected: "\x1b[1;32m<info>\x1b[m my message"},
{level: logger.DebugLevel, expected: "\x1b[1;36m<debug>\x1b[m my message"},
}
formatter := formatter.NewDefaultFormatter(formatter.EnableColor)
for _, tt := range tests {
t.Run(tt.level.String(), func(t *testing.T) {
assert.Equal(t, tt.expected, formatter.Format(logger.Entry{Level: tt.level, Message: "my message"}))
})
}
}

// =====================================================================================================================
// ================================================= EXAMPLES ==========================================================
// =====================================================================================================================

func ExampleDefaultFormatter() {
defaultFormatter := formatter.NewDefaultFormatter()
defaultFormatter := formatter.NewDefaultFormatter(formatter.DisplayContext)

fmt.Println(defaultFormatter.Format(
logger.Entry{
Message: "My log message",
Level: logger.InfoLevel,
Level: logger.InfoLevel,
Context: logger.NewContext().Add("my_key", "my_value"),
},
))
Expand Down
5 changes: 4 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,11 @@ go 1.12

require (
bou.ke/monkey v1.0.1
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/google/go-cmp v0.3.0 // indirect
github.com/kr/pretty v0.1.0 // indirect
github.com/pkg/errors v0.8.1 // indirect
github.com/stretchr/testify v1.3.0
github.com/stretchr/testify v1.4.0
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
gotest.tools v2.2.0+incompatible
)
16 changes: 14 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,27 @@ bou.ke/monkey v1.0.1 h1:zEMLInw9xvNakzUUPjfS4Ds6jYPqCFx3m7bRmG5NH2U=
bou.ke/monkey v1.0.1/go.mod h1:FgHuK96Rv2Nlf+0u1OOVDpCMdsWyOFmeeketDHE7LIg=
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
8 changes: 4 additions & 4 deletions logger_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -341,7 +341,7 @@ func ExampleLogger_minLevelFilterHandler() {
output := &Output{}
myLogger := logger.NewLogger(
middleware.MinLevelFilter(logger.WarningLevel)(
handler.Stream(output, formatter.NewDefaultFormatter()),
handler.Stream(output, formatter.NewDefaultFormatter(formatter.DisplayContext)),
),
)

Expand Down Expand Up @@ -371,7 +371,7 @@ func ExampleLogger_groupHandler() {
myLogger := logger.NewLogger(
handler.Group(
handler.Stream(output, formatter.NewJSONEncoder()),
handler.Stream(output2, formatter.NewDefaultFormatter()),
handler.Stream(output2, formatter.NewDefaultFormatter(formatter.DisplayContext)),
),
)

Expand Down Expand Up @@ -438,7 +438,7 @@ func ExampleLogger_placeholderMiddleware() {
func ExampleLogger_wrapHandler() {
output := &Output{}
myLogger := logger.NewLogger(
handler.Stream(output, formatter.NewDefaultFormatter()),
handler.Stream(output, formatter.NewDefaultFormatter(formatter.DisplayContext)),
)
myLogger.Wrap(middleware.MinLevelFilter(logger.WarningLevel))

Expand Down Expand Up @@ -505,7 +505,7 @@ func ExampleLogger_logRotateHandler() {
//Apr 26 12:22:06 hades my_go_logger[69302] <Emergency>: <emergency> Log example7 {"ctx_key":"ctx_value"}
func ExampleLogger_syslogHandler() {
syslogHandler, _ := handler.Syslog(
formatter.NewDefaultFormatter(),
formatter.NewDefaultFormatter(formatter.DisplayContext),
"",
"",
syslog.LOG_DEBUG,
Expand Down

0 comments on commit 393206f

Please sign in to comment.