Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
MF-174 - Add logger interface and go-kit logger implementation (#212)
* Add logger interface and go-kit logger implementation Add wrapper logger interface and wrap go-kit logger in it. Add tests for info, warn, error and log methods. Add log filtering by level. Signed-off-by: Aleksandar Novakovic <anovakovic01@gmail.com> * Refactor logger and replace go-kit logger with wrapper Replace go-kit logger from services with logger wrapper. Refactor code in logger wrapper. Remove unnecessary subpackage, methods and log levels. Signed-off-by: Aleksandar Novakovic <anovakovic01@gmail.com>
- Loading branch information
1 parent
301d855
commit 88b3062
Showing
10 changed files
with
298 additions
and
145 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
// Package logger contains logger API definition, wrapper that | ||
// can be used around any other logger. | ||
package logger |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
package logger | ||
|
||
const ( | ||
// Error level is used when logging errors. | ||
Error Level = iota + 1 | ||
// Warn level is used when logging warnings. | ||
Warn | ||
// Info level is used when logging info data. | ||
Info | ||
) | ||
|
||
// Level represents severity level while logging. | ||
type Level int | ||
|
||
var levels = map[Level]string{ | ||
Error: "error", | ||
Warn: "warn", | ||
Info: "info", | ||
} | ||
|
||
func (lvl Level) String() string { | ||
return levels[lvl] | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
package logger | ||
|
||
import ( | ||
"io" | ||
|
||
"github.com/go-kit/kit/log" | ||
) | ||
|
||
// Logger specifies logging API. | ||
type Logger interface { | ||
// Info logs any object in JSON format on info level. | ||
Info(string) | ||
// Warn logs any object in JSON format on warning level. | ||
Warn(string) | ||
// Error logs any object in JSON format on error level. | ||
Error(string) | ||
} | ||
|
||
var _ Logger = (*logger)(nil) | ||
|
||
type logger struct { | ||
kitLogger log.Logger | ||
} | ||
|
||
// New returns wrapped go kit logger. | ||
func New(out io.Writer) Logger { | ||
l := log.NewJSONLogger(log.NewSyncWriter(out)) | ||
l = log.With(l, "ts", log.DefaultTimestampUTC) | ||
return &logger{l} | ||
} | ||
|
||
func (l logger) Info(msg string) { | ||
l.kitLogger.Log("level", Info.String(), "message", msg) | ||
} | ||
|
||
func (l logger) Warn(msg string) { | ||
l.kitLogger.Log("level", Warn.String(), "message", msg) | ||
} | ||
|
||
func (l logger) Error(msg string) { | ||
l.kitLogger.Log("level", Error.String(), "message", msg) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
package logger_test | ||
|
||
import ( | ||
"encoding/json" | ||
"fmt" | ||
"io" | ||
"testing" | ||
|
||
log "github.com/mainflux/mainflux/logger" | ||
"github.com/stretchr/testify/assert" | ||
) | ||
|
||
var _ io.Writer = (*mockWriter)(nil) | ||
|
||
type mockWriter struct { | ||
value []byte | ||
} | ||
|
||
func (writer *mockWriter) Write(p []byte) (int, error) { | ||
writer.value = p | ||
return len(p), nil | ||
} | ||
|
||
func (writer *mockWriter) Read() (logMsg, error) { | ||
var output logMsg | ||
err := json.Unmarshal(writer.value, &output) | ||
return output, err | ||
} | ||
|
||
type logMsg struct { | ||
Level string `json:"level"` | ||
Message string `json:"message"` | ||
} | ||
|
||
func TestInfo(t *testing.T) { | ||
cases := map[string]struct { | ||
input string | ||
output logMsg | ||
}{ | ||
"info log ordinary string": {"input_string", logMsg{log.Info.String(), "input_string"}}, | ||
"info log empty string": {"", logMsg{log.Info.String(), ""}}, | ||
} | ||
|
||
writer := mockWriter{} | ||
logger := log.New(&writer) | ||
|
||
for desc, tc := range cases { | ||
logger.Info(tc.input) | ||
output, err := writer.Read() | ||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error %s", desc, err)) | ||
assert.Equal(t, tc.output, output, fmt.Sprintf("%s: expected %s got %s", desc, tc.output, output)) | ||
} | ||
} | ||
|
||
func TestWarn(t *testing.T) { | ||
cases := map[string]struct { | ||
input string | ||
output logMsg | ||
}{ | ||
"warn log ordinary string": {"input_string", logMsg{log.Warn.String(), "input_string"}}, | ||
"warn log empty string": {"", logMsg{log.Warn.String(), ""}}, | ||
} | ||
|
||
writer := mockWriter{} | ||
logger := log.New(&writer) | ||
|
||
for desc, tc := range cases { | ||
logger.Warn(tc.input) | ||
output, err := writer.Read() | ||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error %s", desc, err)) | ||
assert.Equal(t, tc.output, output, fmt.Sprintf("%s: expected %s got %s", desc, tc.output, output)) | ||
} | ||
} | ||
|
||
func TestError(t *testing.T) { | ||
cases := map[string]struct { | ||
input string | ||
output logMsg | ||
}{ | ||
"error log ordinary string": {"input_string", logMsg{log.Error.String(), "input_string"}}, | ||
"error log empty string": {"", logMsg{log.Error.String(), ""}}, | ||
} | ||
|
||
writer := mockWriter{} | ||
logger := log.New(&writer) | ||
|
||
for desc, tc := range cases { | ||
logger.Error(tc.input) | ||
output, err := writer.Read() | ||
assert.Nil(t, err, fmt.Sprintf("%s: unexpected error %s", desc, err)) | ||
assert.Equal(t, tc.output, output, fmt.Sprintf("%s: expected %s got %s", desc, tc.output, output)) | ||
} | ||
} |
Oops, something went wrong.