MEDIUM: logs: add support for RFC5424 header format per logger

The function __send_log() iterates over senders and passes the header as
the first vector to sendmsg(), thus it can send a logger-specific header
in each message.

A new logger arguments "format rfc5424" should be used in order to enable
RFC5424 header format. For example:

    log 10.2.3.4:1234 len 2048 format rfc5424 local2 info
diff --git a/include/proto/log.h b/include/proto/log.h
index e8b57d8..fca7fdd 100644
--- a/include/proto/log.h
+++ b/include/proto/log.h
@@ -39,7 +39,12 @@
 extern char default_tcp_log_format[];
 extern char default_http_log_format[];
 extern char clf_http_log_format[];
+
+extern char default_host_tag_pid_log_format[];
+extern char rfc5424_host_tag_pid_log_format[];
+
 extern char *logheader;
+extern char *logheader_rfc5424;
 extern char *logline;
 
 
@@ -109,6 +114,11 @@
 void __send_log(struct proxy *p, int level, char *message, size_t size);
 
 /*
+ * returns log format for <fmt> or -1 if not found.
+ */
+int get_log_format(const char *fmt);
+
+/*
  * returns log level for <lev> or -1 if not found.
  */
 int get_log_level(const char *lev);
@@ -141,7 +151,7 @@
 /*
  * Write hostname, log_tag and pid to the log string
  */
-char *lf_host_tag_pid(char *dst, const char *hostname, const char *log_tag, int pid, size_t size);
+char *lf_host_tag_pid(char *dst, const char *format, const char *hostname, const char *log_tag, int pid, size_t size);
 
 
 #endif /* _PROTO_LOG_H */
diff --git a/include/types/log.h b/include/types/log.h
index 0214ae6..2cfd31a 100644
--- a/include/types/log.h
+++ b/include/types/log.h
@@ -37,6 +37,13 @@
 /* The array containing the names of the log levels. */
 extern const char *log_levels[];
 
+/* enum for log format */
+enum {
+	LOG_FORMAT_RFC3164 = 0,
+	LOG_FORMAT_RFC5424,
+	LOG_FORMATS,          /* number of supported log formats, must always be last */
+};
+
 /* lists of fields that can be logged */
 enum {
 
@@ -158,6 +165,7 @@
 struct logsrv {
 	struct list list;
 	struct sockaddr_storage addr;
+	int format;
 	int facility;
 	int level;
 	int minlvl;
diff --git a/include/types/proxy.h b/include/types/proxy.h
index 1400126..9793a29 100644
--- a/include/types/proxy.h
+++ b/include/types/proxy.h
@@ -346,7 +346,8 @@
 	struct list logsrvs;
 	struct list logformat; 			/* log_format linked list */
 	char *log_tag;                          /* override default syslog tag */
-	struct chunk log_htp;			/* a syslog header part that contains hostname, log_tag and pid */
+	struct chunk log_htp;			/* a syslog header part that contains hostname, log_tag and pid (RFC3164 format) */
+	struct chunk log_htp_rfc5424;		/* a syslog header part that contains hostname, log_tag and pid (RFC5424 format) */
 	char *header_unique_id; 		/* unique-id header */
 	struct list format_unique_id;		/* unique-id format */
 	int to_log;				/* things to be logged (LW_*) */