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