entry: log with spaces between all operands on *ln #25
diff --git a/entry.go b/entry.go
index 1db7dd7..27aa967 100644
--- a/entry.go
+++ b/entry.go
@@ -175,33 +175,54 @@
 // Entry Println family functions
 
 func (entry *Entry) Debugln(args ...interface{}) {
-	entry.Debug(args...)
+	if entry.Logger.Level >= Debug {
+		entry.Debug(entry.sprintlnn(args...))
+	}
 }
 
 func (entry *Entry) Infoln(args ...interface{}) {
-	entry.Info(args...)
+	if entry.Logger.Level >= Info {
+		entry.Info(entry.sprintlnn(args...))
+	}
 }
 
 func (entry *Entry) Println(args ...interface{}) {
-	entry.Info(args...)
+	entry.Infoln(args...)
 }
 
 func (entry *Entry) Warnln(args ...interface{}) {
-	entry.Warn(args...)
+	if entry.Logger.Level >= Warn {
+		entry.Warn(entry.sprintlnn(args...))
+	}
 }
 
 func (entry *Entry) Warningln(args ...interface{}) {
-	entry.Warn(args...)
+	entry.Warnln(args...)
 }
 
 func (entry *Entry) Errorln(args ...interface{}) {
-	entry.Error(args...)
+	if entry.Logger.Level >= Error {
+		entry.Error(entry.sprintlnn(args...))
+	}
 }
 
 func (entry *Entry) Fatalln(args ...interface{}) {
-	entry.Fatal(args...)
+	if entry.Logger.Level >= Fatal {
+		entry.Fatal(entry.sprintlnn(args...))
+	}
 }
 
 func (entry *Entry) Panicln(args ...interface{}) {
-	entry.Panic(args...)
+	if entry.Logger.Level >= Panic {
+		entry.Panic(entry.sprintlnn(args...))
+	}
+}
+
+// Sprintlnn => Sprint no newline. This is to get the behavior of how
+// fmt.Sprintln where spaces are always added between operands, regardless of
+// their type. Instead of vendoring the Sprintln implementation to spare a
+// string allocation, we do the simplest thing.
+func (entry *Entry) sprintlnn(args ...interface{}) string {
+	msg := fmt.Sprintln(args...)
+	return msg[:len(msg)-1]
 }
diff --git a/logrus_test.go b/logrus_test.go
index 5889db5..7f1a009 100644
--- a/logrus_test.go
+++ b/logrus_test.go
@@ -53,6 +53,54 @@
 	})
 }
 
+func TestInfolnShouldAddSpacesBetweenStrings(t *testing.T) {
+	LogAndAssertJSON(t, func(log *Logger) {
+		log.Infoln("test", "test")
+	}, func(fields Fields) {
+		assert.Equal(t, fields["msg"], "test test")
+	})
+}
+
+func TestInfolnShouldAddSpacesBetweenStringAndNonstring(t *testing.T) {
+	LogAndAssertJSON(t, func(log *Logger) {
+		log.Infoln("test", 10)
+	}, func(fields Fields) {
+		assert.Equal(t, fields["msg"], "test 10")
+	})
+}
+
+func TestInfolnShouldAddSpacesBetweenTwoNonStrings(t *testing.T) {
+	LogAndAssertJSON(t, func(log *Logger) {
+		log.Infoln(10, 10)
+	}, func(fields Fields) {
+		assert.Equal(t, fields["msg"], "10 10")
+	})
+}
+
+func TestInfoShouldAddSpacesBetweenTwoNonStrings(t *testing.T) {
+	LogAndAssertJSON(t, func(log *Logger) {
+		log.Infoln(10, 10)
+	}, func(fields Fields) {
+		assert.Equal(t, fields["msg"], "10 10")
+	})
+}
+
+func TestInfoShouldNotAddSpacesBetweenStringAndNonstring(t *testing.T) {
+	LogAndAssertJSON(t, func(log *Logger) {
+		log.Info("test", 10)
+	}, func(fields Fields) {
+		assert.Equal(t, fields["msg"], "test10")
+	})
+}
+
+func TestInfoShouldNotAddSpacesBetweenStrings(t *testing.T) {
+	LogAndAssertJSON(t, func(log *Logger) {
+		log.Info("test", "test")
+	}, func(fields Fields) {
+		assert.Equal(t, fields["msg"], "testtest")
+	})
+}
+
 type SlowString string
 
 func (s SlowString) String() string {