Added support to chain withfields
`WithField` and `WithFields` right now doesn't chain properly. Meaning
that if you do something like:
localLog := logger.WithField("tag", "value")
localLog.WithField("v1", "value").Info("message1")
localLog.Info("message2")
The `v1` will be carried over to `message2`.
With this patch, each WithField/WithFields call are isolated.
diff --git a/entry.go b/entry.go
index 8cd312e..052697c 100644
--- a/entry.go
+++ b/entry.go
@@ -38,15 +38,23 @@
}
func (entry *Entry) WithField(key string, value interface{}) *Entry {
- entry.Data[key] = value
- return entry
+ data := Fields{}
+ for k, v := range entry.Data {
+ data[k] = v
+ }
+ data[key] = value
+ return &Entry{Logger: entry.Logger, Data: data}
}
func (entry *Entry) WithFields(fields Fields) *Entry {
- for key, value := range fields {
- entry.WithField(key, value)
+ data := Fields{}
+ for k, v := range entry.Data {
+ data[k] = v
}
- return entry
+ for k, v := range fields {
+ data[k] = v
+ }
+ return &Entry{Logger: entry.Logger, Data: data}
}
func (entry *Entry) log(level string, levelInt Level, msg string) string {