diff --git a/doc/configuration.txt b/doc/configuration.txt
index 6f30014eb..f20b8b2ea 100644
--- a/doc/configuration.txt
+++ b/doc/configuration.txt
@@ -435,6 +435,7 @@ The following keywords are supported in the "global" section :
- gid
- group
- log
+ - log-send-hostname
- nbproc
- pidfile
- uid
@@ -527,6 +528,13 @@ log
[max level [min level]]
emerg alert crit err warning notice info debug
+log-send-hostname []
+ Sets the hostname field in the syslog header. If optional "string" parameter
+ is set the header is set to the string contents, otherwise uses the hostname
+ of the system. Generally used if one is not relaying logs through an
+ intermediate syslog server or for simply customizing the hostname printed in
+ the logs.
+
nbproc
Creates processes when going daemon. This requires the "daemon"
mode. By default, only one process is created, which is the recommended mode
diff --git a/include/types/global.h b/include/types/global.h
index 906a52cc9..faf9bb28d 100644
--- a/include/types/global.h
+++ b/include/types/global.h
@@ -80,6 +80,7 @@ struct global {
int loglev1, loglev2;
int minlvl1, minlvl2;
struct logsrv logsrv1, logsrv2;
+ char *log_send_hostname; /* set hostname in syslog header */
struct {
int maxpollevents; /* max number of poll events at once */
int maxaccept; /* max number of consecutive accept() */
diff --git a/src/cfgparse.c b/src/cfgparse.c
index 9d3e2fc40..ddfbe4253 100644
--- a/src/cfgparse.c
+++ b/src/cfgparse.c
@@ -966,6 +966,28 @@ int cfg_parse_global(const char *file, int linenum, char **args, int kwm)
err_code |= ERR_ALERT | ERR_FATAL;
}
}
+ else if (!strcmp(args[0], "log-send-hostname")) { /* set the hostname in syslog header */
+ char *name;
+ int len;
+
+ if (global.log_send_hostname != NULL) {
+ Alert("parsing [%s:%d] : '%s' already specified. Continuing.\n", file, linenum, args[0]);
+ err_code |= ERR_ALERT;
+ goto out;
+ }
+
+ if (*(args[1]))
+ name = args[1];
+ else
+ name = hostname;
+
+ len = strlen(name);
+
+ /* We'll add a space after the name to respect the log format */
+ free(global.log_send_hostname);
+ global.log_send_hostname = malloc(len + 2);
+ snprintf(global.log_send_hostname, len + 2, "%s ", name);
+ }
else if (!strcmp(args[0], "spread-checks")) { /* random time between checks (0-50) */
if (global.spread_checks != 0) {
Alert("parsing [%s:%d]: spread-checks already specified. Continuing.\n", file, linenum);
diff --git a/src/haproxy.c b/src/haproxy.c
index c5aa3ccc5..9ba08201a 100644
--- a/src/haproxy.c
+++ b/src/haproxy.c
@@ -867,6 +867,7 @@ void deinit(void)
protocol_unbind_all();
+ free(global.log_send_hostname); global.log_send_hostname = NULL;
free(global.chroot); global.chroot = NULL;
free(global.pidfile); global.pidfile = NULL;
free(global.node); global.node = NULL;
diff --git a/src/log.c b/src/log.c
index d1387b5f7..d52727b6f 100644
--- a/src/log.c
+++ b/src/log.c
@@ -189,9 +189,10 @@ void send_log(struct proxy *p, int level, const char *message, ...)
get_localtime(tvsec, &tm);
hdr_len = snprintf(logmsg, sizeof(logmsg),
- "<<<<>%s %2d %02d:%02d:%02d %s[%d]: ",
+ "<<<<>%s %2d %02d:%02d:%02d %s%s[%d]: ",
monthname[tm.tm_mon],
tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec,
+ global.log_send_hostname ? global.log_send_hostname : "",
progname, pid);
/* WARNING: depending upon implementations, snprintf may return
* either -1 or the number of bytes that would be needed to store