Add "syslog" log format.

I didn't contribute this patch to the upstream because I don't wanna
contribute to any Go projects. However, if you find this patch useful,
feel free to send it to the upstream under your name.

--- a/log/configuration.go
+++ b/log/configuration.go
@@ -12,6 +12,7 @@
 	FormatRunner = "runner"
 	FormatText   = "text"
 	FormatJSON   = "json"
+	FormatSyslog = "syslog"
 )
 
 var (
@@ -25,7 +26,7 @@
 		},
 		cli.StringFlag{
 			Name:   "log-format",
-			Usage:  "Choose log format (options: runner, text, json)",
+			Usage:  "Choose log format (options: runner, text, json, syslog)",
 			EnvVar: "LOG_FORMAT",
 		},
 		cli.StringFlag{
@@ -39,6 +40,7 @@
 		FormatRunner: new(RunnerTextFormatter),
 		FormatText:   new(logrus.TextFormatter),
 		FormatJSON:   new(logrus.JSONFormatter),
+		FormatSyslog: new(SyslogFormatter),
 	}
 )
 
--- a/log/syslog_formatter.go
+++ b/log/syslog_formatter.go
@@ -0,0 +1,57 @@
+package log
+
+import (
+	"bytes"
+	"fmt"
+	"time"
+
+	"github.com/sirupsen/logrus"
+)
+
+type SyslogFormatter struct {
+}
+
+func (f *SyslogFormatter) Format(entry *logrus.Entry) ([]byte, error) {
+	var b *bytes.Buffer
+	if entry.Buffer != nil {
+		b = entry.Buffer
+	} else {
+		b = &bytes.Buffer{}
+	}
+
+	if entry.Message != "" {
+		b.WriteString(entry.Message)
+	}
+	dataWritten := false
+	for key, val := range entry.Data {
+		if key == "now" {
+			continue
+		}
+		var stringVal string
+
+		switch val := val.(type) {
+		case time.Time:
+			stringVal = val.Format(time.RFC3339)
+		default:
+			var ok bool
+			if stringVal, ok = val.(string); !ok {
+				stringVal = fmt.Sprint(val)
+			}
+		}
+
+		// The format is inspired by RFC 5424 STRUCTURED-DATA.
+		if dataWritten {
+			b.WriteByte(' ')
+		} else {
+			b.WriteString(" [meta ")
+			dataWritten = true
+		}
+		b.WriteString(fmt.Sprintf("%s=%q", key, stringVal))
+	}
+	if dataWritten {
+		b.WriteByte(']')
+	}
+	b.WriteByte('\n')
+
+	return b.Bytes(), nil
+}
