Skip to content

Commit

Permalink
Fixes #30 Breaking out msg/time/level
Browse files Browse the repository at this point in the history
Fixes #29 "time" should be a time.Time
  • Loading branch information
rnapier committed May 27, 2014
1 parent fe381bf commit 7679f44
Show file tree
Hide file tree
Showing 6 changed files with 178 additions and 96 deletions.
23 changes: 13 additions & 10 deletions entry.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ import (

type Entry struct {
Logger *Logger
Time time.Time
Level Level
Msg string
Data Fields
}

Expand Down Expand Up @@ -49,10 +52,10 @@ func (entry *Entry) WithFields(fields Fields) *Entry {
return entry
}

func (entry *Entry) log(level string, levelInt Level, msg string) string {
entry.Data["time"] = time.Now().String()
entry.Data["level"] = level
entry.Data["msg"] = msg
func (entry *Entry) log(levelInt Level, msg string) string {
entry.Time = time.Now()
entry.Level = levelInt
entry.Msg = msg

if err := entry.Logger.Hooks.Fire(levelInt, entry); err != nil {
fmt.Fprintf(os.Stderr, "Failed to fire hook", err)
Expand All @@ -76,7 +79,7 @@ func (entry *Entry) log(level string, levelInt Level, msg string) string {

func (entry *Entry) Debug(args ...interface{}) {
if entry.Logger.Level >= Debug {
entry.log("debug", Debug, fmt.Sprint(args...))
entry.log(Debug, fmt.Sprint(args...))
}
}

Expand All @@ -86,32 +89,32 @@ func (entry *Entry) Print(args ...interface{}) {

func (entry *Entry) Info(args ...interface{}) {
if entry.Logger.Level >= Info {
entry.log("info", Info, fmt.Sprint(args...))
entry.log(Info, fmt.Sprint(args...))
}
}

func (entry *Entry) Warn(args ...interface{}) {
if entry.Logger.Level >= Warn {
entry.log("warning", Warn, fmt.Sprint(args...))
entry.log(Warn, fmt.Sprint(args...))
}
}

func (entry *Entry) Error(args ...interface{}) {
if entry.Logger.Level >= Error {
entry.log("error", Error, fmt.Sprint(args...))
entry.log(Error, fmt.Sprint(args...))
}
}

func (entry *Entry) Fatal(args ...interface{}) {
if entry.Logger.Level >= Fatal {
entry.log("fatal", Fatal, fmt.Sprint(args...))
entry.log(Fatal, fmt.Sprint(args...))
}
os.Exit(1)
}

func (entry *Entry) Panic(args ...interface{}) {
if entry.Logger.Level >= Panic {
msg := entry.log("panic", Panic, fmt.Sprint(args...))
msg := entry.log(Panic, fmt.Sprint(args...))
panic(msg)
}
panic(fmt.Sprint(args...))
Expand Down
14 changes: 7 additions & 7 deletions hook_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ func TestHookFires(t *testing.T) {
assert.Equal(t, hook.Fired, false)

log.Print("test")
}, func(fields Fields) {
}, func(entry *Entry) {
assert.Equal(t, hook.Fired, true)
})
}
Expand Down Expand Up @@ -64,8 +64,8 @@ func TestHookCanModifyEntry(t *testing.T) {
LogAndAssertJSON(t, func(log *Logger) {
log.Hooks.Add(hook)
log.WithField("wow", "elephant").Print("test")
}, func(fields Fields) {
assert.Equal(t, fields["wow"], "whale")
}, func(entry *Entry) {
assert.Equal(t, entry.Data["wow"], "whale")
})
}

Expand All @@ -78,8 +78,8 @@ func TestCanFireMultipleHooks(t *testing.T) {
log.Hooks.Add(hook2)

log.WithField("wow", "elephant").Print("test")
}, func(fields Fields) {
assert.Equal(t, fields["wow"], "whale")
}, func(entry *Entry) {
assert.Equal(t, entry.Data["wow"], "whale")
assert.Equal(t, hook2.Fired, true)
})
}
Expand All @@ -105,7 +105,7 @@ func TestErrorHookShouldntFireOnInfo(t *testing.T) {
LogAndAssertJSON(t, func(log *Logger) {
log.Hooks.Add(hook)
log.Info("test")
}, func(fields Fields) {
}, func(entry *Entry) {
assert.Equal(t, hook.Fired, false)
})
}
Expand All @@ -116,7 +116,7 @@ func TestErrorHookShouldFireOnError(t *testing.T) {
LogAndAssertJSON(t, func(log *Logger) {
log.Hooks.Add(hook)
log.Error("test")
}, func(fields Fields) {
}, func(entry *Entry) {
assert.Equal(t, hook.Fired, true)
})
}
65 changes: 63 additions & 2 deletions json_formatter.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,76 @@ package logrus
import (
"encoding/json"
"fmt"
"time"
)

type JSONFormatter struct {
}

type jsonEntry struct {
Time time.Time `json:"time"`
Level string `json:"level"`
Msg string `json:"msg"`
Data Fields `json:"data,omitempty"`
}

func (f *JSONFormatter) Format(entry *Entry) ([]byte, error) {
serialized, err := json.Marshal(entry.Data)
jsonEntry := jsonEntry{
Time: entry.Time,
Msg: entry.Msg,
Data: entry.Data,
}

switch entry.Level {
case Debug:
jsonEntry.Level = "debug"
case Info:
jsonEntry.Level = "info"
case Warn:
jsonEntry.Level = "warn"
case Error:
jsonEntry.Level = "error"
case Fatal:
jsonEntry.Level = "fatal"
case Panic:
jsonEntry.Level = "panic"
}

serialized, err := json.Marshal(jsonEntry)
if err != nil {
return nil, fmt.Errorf("Failed to marshal fields to JSON, %v", err)
return nil, fmt.Errorf("Failed to marshal data to JSON, %v", err)
}
return append(serialized, '\n'), nil
}

func (f *JSONFormatter) Unformat(buffer []byte) (*Entry, error) {
var jsonEntry jsonEntry

err := json.Unmarshal(buffer, &jsonEntry)
if err != nil {
return nil, fmt.Errorf("Failed to unmarshal entry to JSON, %v", err)
}

entry := Entry{
Time: jsonEntry.Time,
Msg: jsonEntry.Msg,
Data: jsonEntry.Data,
}

switch jsonEntry.Level {
case "debug":
entry.Level = Debug
case "info":
entry.Level = Info
case "warn":
entry.Level = Warn
case "error":
entry.Level = Error
case "fatal":
entry.Level = Fatal
case "panic":
entry.Level = Panic
}

return &entry, nil
}
55 changes: 28 additions & 27 deletions logrus_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,99 +2,100 @@ package logrus

import (
"bytes"
"encoding/json"
"testing"

"github.com/stretchr/testify/assert"
)

func LogAndAssertJSON(t *testing.T, log func(*Logger), assertions func(fields Fields)) {
func LogAndAssertJSON(t *testing.T, log func(*Logger), assertions func(entry *Entry)) {
var buffer bytes.Buffer
var fields Fields

logger := New()
logger.Out = &buffer
logger.Formatter = new(JSONFormatter)
formatter := new(JSONFormatter)
logger.Formatter = formatter

log(logger)

err := json.Unmarshal(buffer.Bytes(), &fields)
entry, err := formatter.Unformat(buffer.Bytes())
assert.Nil(t, err)

assertions(fields)
if assert.NotNil(t, entry) {
assertions(entry)
}
}

func TestPrint(t *testing.T) {
LogAndAssertJSON(t, func(log *Logger) {
log.Print("test")
}, func(fields Fields) {
assert.Equal(t, fields["msg"], "test")
assert.Equal(t, fields["level"], "info")
}, func(entry *Entry) {
assert.Equal(t, entry.Msg, "test")
assert.Equal(t, entry.Level, Info)
})
}

func TestInfo(t *testing.T) {
LogAndAssertJSON(t, func(log *Logger) {
log.Info("test")
}, func(fields Fields) {
assert.Equal(t, fields["msg"], "test")
assert.Equal(t, fields["level"], "info")
}, func(entry *Entry) {
assert.Equal(t, entry.Msg, "test")
assert.Equal(t, entry.Level, Info)
})
}

func TestWarn(t *testing.T) {
LogAndAssertJSON(t, func(log *Logger) {
log.Warn("test")
}, func(fields Fields) {
assert.Equal(t, fields["msg"], "test")
assert.Equal(t, fields["level"], "warning")
}, func(entry *Entry) {
assert.Equal(t, entry.Msg, "test")
assert.Equal(t, entry.Level, Warn)
})
}

func TestInfolnShouldAddSpacesBetweenStrings(t *testing.T) {
LogAndAssertJSON(t, func(log *Logger) {
log.Infoln("test", "test")
}, func(fields Fields) {
assert.Equal(t, fields["msg"], "test test")
}, func(entry *Entry) {
assert.Equal(t, entry.Msg, "test test")
})
}

func TestInfolnShouldAddSpacesBetweenStringAndNonstring(t *testing.T) {
LogAndAssertJSON(t, func(log *Logger) {
log.Infoln("test", 10)
}, func(fields Fields) {
assert.Equal(t, fields["msg"], "test 10")
}, func(entry *Entry) {
assert.Equal(t, entry.Msg, "test 10")
})
}

func TestInfolnShouldAddSpacesBetweenTwoNonStrings(t *testing.T) {
LogAndAssertJSON(t, func(log *Logger) {
log.Infoln(10, 10)
}, func(fields Fields) {
assert.Equal(t, fields["msg"], "10 10")
}, func(entry *Entry) {
assert.Equal(t, entry.Msg, "10 10")
})
}

func TestInfoShouldAddSpacesBetweenTwoNonStrings(t *testing.T) {
LogAndAssertJSON(t, func(log *Logger) {
log.Infoln(10, 10)
}, func(fields Fields) {
assert.Equal(t, fields["msg"], "10 10")
}, func(entry *Entry) {
assert.Equal(t, entry.Msg, "10 10")
})
}

func TestInfoShouldNotAddSpacesBetweenStringAndNonstring(t *testing.T) {
LogAndAssertJSON(t, func(log *Logger) {
log.Info("test", 10)
}, func(fields Fields) {
assert.Equal(t, fields["msg"], "test10")
}, func(entry *Entry) {
assert.Equal(t, entry.Msg, "test10")
})
}

func TestInfoShouldNotAddSpacesBetweenStrings(t *testing.T) {
LogAndAssertJSON(t, func(log *Logger) {
log.Info("test", "test")
}, func(fields Fields) {
assert.Equal(t, fields["msg"], "testtest")
}, func(entry *Entry) {
assert.Equal(t, entry.Msg, "testtest")
})
}
Loading

0 comments on commit 7679f44

Please sign in to comment.