Skip to content

Commit

Permalink
Merge pull request #27 from lefinal/feat-add-error-message-omit
Browse files Browse the repository at this point in the history
feat(mehlog): add option to omit error message field
  • Loading branch information
lefinal authored Sep 11, 2023
2 parents 53a7761 + 290869a commit 4c2042d
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 2 deletions.
20 changes: 19 additions & 1 deletion mehlog/mehlog.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,18 @@ import (
"sync"
)

var omitErrorMessageField = false
var omitErrorMessageFieldMutex sync.RWMutex

// OmitErrorMessageField sets whether the error message field with key
// meh.MapFieldErrorMessage should be omitted in logs and only output as log
// message in order to improve human readability.
func OmitErrorMessageField(omit bool) {
omitErrorMessageFieldMutex.Lock()
defer omitErrorMessageFieldMutex.Unlock()
omitErrorMessageField = omit
}

var (
// defaultLevelTranslator is the default LevelTranslator that translates every
// meh.Code to zapcore.ErrorLevel.
Expand Down Expand Up @@ -48,17 +60,23 @@ func Log(logger *zap.Logger, err error) {
func LogToLevel(logger *zap.Logger, level zapcore.Level, err error) {
e := meh.Cast(err)
// Build fields.
omitErrorMessageFieldMutex.RLock()
omitErrorMessageField := omitErrorMessageField
omitErrorMessageFieldMutex.RUnlock()
fieldMap := meh.ToMap(e)
fields := make([]zap.Field, 0, len(fieldMap))
for k, v := range fieldMap {
if omitErrorMessageField && k == meh.MapFieldErrorMessage {
continue
}
fields = append(fields, zap.Any(k, v))
}
// Log it.
logToLevel(logger, level, e.Error(), fields...)
}

// logToLevel calls the correct LogToLevel method for the given zap.Logger based on the
// zapcore.level.
// zapcore.Level.
func logToLevel(logger *zap.Logger, level zapcore.Level, message string, fields ...zapcore.Field) {
switch level {
case zapcore.DebugLevel:
Expand Down
40 changes: 39 additions & 1 deletion mehlog/mehlog_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,44 @@ func (suite *LogSuite) TestErrorMessage() {
suite.Equal(e.Error(), records[0].Entry.Message, "should use error message as message")
}

// TestOmitErrorMessageField assures that the error message field is not logged
// if omitted.
func (suite *LogSuite) TestOmitErrorMessageField() {
oldOmitted := omitErrorMessageField
OmitErrorMessageField(true)
defer OmitErrorMessageField(oldOmitted)
logger, rec := zaprec.NewRecorder(nil)
e := meh.Wrap(&meh.Error{Message: "inner"}, "outer", nil)
Log(logger, e)
records := rec.Records()
suite.Require().Len(records, 1, "should have been logged")
suite.Equal(e.Error(), records[0].Entry.Message, "should use error message as message")
fieldNames := make([]string, 0)
for _, field := range records[0].Fields {
fieldNames = append(fieldNames, field.Key)
}
suite.NotContains(fieldNames, meh.MapFieldErrorMessage, "should not contain error message")
}

// TestIncludeErrorMessageField assures that the error message field is logged if
// not omitted.
func (suite *LogSuite) TestIncludeErrorMessageField() {
oldOmitted := omitErrorMessageField
OmitErrorMessageField(false)
defer OmitErrorMessageField(oldOmitted)
logger, rec := zaprec.NewRecorder(nil)
e := meh.Wrap(&meh.Error{Message: "inner"}, "outer", nil)
Log(logger, e)
records := rec.Records()
suite.Require().Len(records, 1, "should have been logged")
suite.Equal(e.Error(), records[0].Entry.Message, "should use error message as message")
fieldNames := make([]string, 0)
for _, field := range records[0].Fields {
fieldNames = append(fieldNames, field.Key)
}
suite.Contains(fieldNames, meh.MapFieldErrorMessage, "should not contain error message")
}

func TestLog(t *testing.T) {
suite.Run(t, new(LogSuite))
}
Expand All @@ -99,7 +137,7 @@ type logToLevelSuite struct {

// expect a logToLevel call with the given in-level to log an entry with given
// out-level.
func (suite logToLevelSuite) expect(levelIn zapcore.Level, levelOut zapcore.Level) {
func (suite *logToLevelSuite) expect(levelIn zapcore.Level, levelOut zapcore.Level) {
logger, rec := zaprec.NewRecorder(nil)
logToLevel(logger, levelIn, "meow")
suite.Len(rec.Records(), 1, "should have been logged")
Expand Down

0 comments on commit 4c2042d

Please sign in to comment.