diff --git a/fields.go b/fields.go new file mode 100644 index 0000000..531e0c9 --- /dev/null +++ b/fields.go @@ -0,0 +1,6 @@ +package log + +func (l myLogger) WithFields(fields Fields) Logger { + l.data = fields + return l +} diff --git a/logger.go b/logger.go index 254be91..4f69469 100644 --- a/logger.go +++ b/logger.go @@ -29,4 +29,6 @@ type Logger interface { End(a ...interface{}) Level(uint8) Logger + + WithFields(fields Fields) Logger } diff --git a/my_logger.go b/my_logger.go index 5fbbca4..50b9ef1 100644 --- a/my_logger.go +++ b/my_logger.go @@ -13,22 +13,41 @@ var ( DefaultTimeFormat = time.RFC3339 ) +type Fields map[string]interface{} + type myLogger struct { Writer io.Writer prefix string begin time.Time level uint8 + data Fields } func logPrefix(level uint8) string { return fmt.Sprintf("time=%q level=%s function=%s", time.Now().Format(DefaultTimeFormat), unmarshalLevel(level), funcName()) } +func (fields Fields) String() string { + if len(fields) == 0 { + return "" + } + var buffer strings.Builder + for k, v := range fields { + switch v := v.(type) { + case string: + buffer.WriteString(fmt.Sprintf(" %s=%q", k, v)) + default: + buffer.WriteString(fmt.Sprintf(" %s=%v", k, v)) + } + } + return buffer.String() +} + func (l myLogger) log(level uint8, s ...interface{}) { if l.Writer == nil { return } - f := fmt.Sprintf("%s%s msg=%q", logPrefix(level), l.prefix, fmt.Sprint(s...)) + f := fmt.Sprintf("%s%s msg=%q %s", logPrefix(level), l.prefix, fmt.Sprint(s...), l.data) fmt.Fprintln(l.Writer, f) } @@ -36,9 +55,8 @@ func (l myLogger) logf(level uint8, format string, s ...interface{}) { if l.Writer == nil { return } - format = fmt.Sprintf("%%s %%s msg=\"%s\"\n", format) + format = fmt.Sprintf("%%s %%s msg=\"%s\" %s\n", format, l.data) s = append([]interface{}{logPrefix(level), l.prefix}, s...) - fmt.Fprintf(l.Writer, format, s...) }