Merge pull request #34 from shuhaowu/chained-with-fields

Added support to chain withfields
diff --git a/entry.go b/entry.go
index 8cd312e..08cc15f 100644
--- a/entry.go
+++ b/entry.go
@@ -38,15 +38,18 @@
 }
 
 func (entry *Entry) WithField(key string, value interface{}) *Entry {
-	entry.Data[key] = value
-	return entry
+	return entry.WithFields(Fields{key: value})
 }
 
 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 {
diff --git a/logrus_test.go b/logrus_test.go
index 96a66a2..82187ae 100644
--- a/logrus_test.go
+++ b/logrus_test.go
@@ -98,3 +98,33 @@
 		assert.Equal(t, fields["msg"], "testtest")
 	})
 }
+
+func TestWithFieldsShouldAllowAssignments(t *testing.T) {
+	var buffer bytes.Buffer
+	var fields Fields
+
+	logger := New()
+	logger.Out = &buffer
+	logger.Formatter = new(JSONFormatter)
+
+	localLog := logger.WithFields(Fields{
+		"key1": "value1",
+	})
+
+	localLog.WithField("key2", "value2").Info("test")
+	err := json.Unmarshal(buffer.Bytes(), &fields)
+	assert.Nil(t, err)
+
+	assert.Equal(t, "value2", fields["key2"])
+	assert.Equal(t, "value1", fields["key1"])
+
+	buffer = bytes.Buffer{}
+	fields = Fields{}
+	localLog.Info("test")
+	err = json.Unmarshal(buffer.Bytes(), &fields)
+	assert.Nil(t, err)
+
+	_, ok := fields["key2"]
+	assert.Equal(t, false, ok)
+	assert.Equal(t, "value1", fields["key1"])
+}