diff --git a/src/cfgparse.c b/src/cfgparse.c
index 762978a..e6e65b4 100644
--- a/src/cfgparse.c
+++ b/src/cfgparse.c
@@ -1254,6 +1254,8 @@
 		struct sockaddr_storage *sk;
 		int port1, port2;
 		struct logsrv *logsrv;
+		int arg = 0;
+		int len = 0;
 
 		if (*(args[1]) == 0 || *(args[2]) == 0) {
 			Alert("parsing [%s:%d] : '%s' expects <address> and <facility> as arguments.\n", file, linenum, args[0]);
@@ -1263,28 +1265,50 @@
 
 		logsrv = calloc(1, sizeof(struct logsrv));
 
-		logsrv->facility = get_log_facility(args[2]);
+		/* just after the address, a length may be specified */
+		if (strcmp(args[arg+2], "len") == 0) {
+			len = atoi(args[arg+3]);
+			if (len < 80 || len > 65535) {
+				Alert("parsing [%s:%d] : invalid log length '%s', must be between 80 and 65535.\n",
+				      file, linenum, args[arg+3]);
+				err_code |= ERR_ALERT | ERR_FATAL;
+				goto out;
+			}
+			logsrv->maxlen = len;
+
+			/* skip these two args */
+			arg += 2;
+		}
+		else
+			logsrv->maxlen = MAX_SYSLOG_LEN;
+
+		if (logsrv->maxlen > global.max_syslog_len) {
+			global.max_syslog_len = logsrv->maxlen;
+			logline = realloc(logline, global.max_syslog_len + 1);
+		}
+
+		logsrv->facility = get_log_facility(args[arg+2]);
 		if (logsrv->facility < 0) {
-			Alert("parsing [%s:%d] : unknown log facility '%s'\n", file, linenum, args[2]);
+			Alert("parsing [%s:%d] : unknown log facility '%s'\n", file, linenum, args[arg+2]);
 			err_code |= ERR_ALERT | ERR_FATAL;
 			logsrv->facility = 0;
 		}
 
 		logsrv->level = 7; /* max syslog level = debug */
-		if (*(args[3])) {
-			logsrv->level = get_log_level(args[3]);
+		if (*(args[arg+3])) {
+			logsrv->level = get_log_level(args[arg+3]);
 			if (logsrv->level < 0) {
-				Alert("parsing [%s:%d] : unknown optional log level '%s'\n", file, linenum, args[3]);
+				Alert("parsing [%s:%d] : unknown optional log level '%s'\n", file, linenum, args[arg+3]);
 				err_code |= ERR_ALERT | ERR_FATAL;
 				logsrv->level = 0;
 			}
 		}
 
 		logsrv->minlvl = 0; /* limit syslog level to this level (emerg) */
-		if (*(args[4])) {
-			logsrv->minlvl = get_log_level(args[4]);
+		if (*(args[arg+4])) {
+			logsrv->minlvl = get_log_level(args[arg+4]);
 			if (logsrv->minlvl < 0) {
-				Alert("parsing [%s:%d] : unknown optional minimum log level '%s'\n", file, linenum, args[4]);
+				Alert("parsing [%s:%d] : unknown optional minimum log level '%s'\n", file, linenum, args[arg+4]);
 				err_code |= ERR_ALERT | ERR_FATAL;
 				logsrv->minlvl = 0;
 			}
@@ -4791,22 +4815,46 @@
 		else if (*(args[1]) && *(args[2])) {
 			struct sockaddr_storage *sk;
 			int port1, port2;
+			int arg = 0;
+			int len = 0;
 
 			logsrv = calloc(1, sizeof(struct logsrv));
 
-			logsrv->facility = get_log_facility(args[2]);
+			/* just after the address, a length may be specified */
+			if (strcmp(args[arg+2], "len") == 0) {
+				len = atoi(args[arg+3]);
+				if (len < 80 || len > 65535) {
+					Alert("parsing [%s:%d] : invalid log length '%s', must be between 80 and 65535.\n",
+					      file, linenum, args[arg+3]);
+					err_code |= ERR_ALERT | ERR_FATAL;
+					goto out;
+				}
+				logsrv->maxlen = len;
+
+				/* skip these two args */
+				arg += 2;
+			}
+			else
+				logsrv->maxlen = MAX_SYSLOG_LEN;
+
+			if (logsrv->maxlen > global.max_syslog_len) {
+				global.max_syslog_len = logsrv->maxlen;
+				logline = realloc(logline, global.max_syslog_len + 1);
+			}
+
+			logsrv->facility = get_log_facility(args[arg+2]);
 			if (logsrv->facility < 0) {
-				Alert("parsing [%s:%d] : unknown log facility '%s'\n", file, linenum, args[2]);
+				Alert("parsing [%s:%d] : unknown log facility '%s'\n", file, linenum, args[arg+2]);
 				err_code |= ERR_ALERT | ERR_FATAL;
 				goto out;
 
 			}
 	    
 			logsrv->level = 7; /* max syslog level = debug */
-			if (*(args[3])) {
-				logsrv->level = get_log_level(args[3]);
+			if (*(args[arg+3])) {
+				logsrv->level = get_log_level(args[arg+3]);
 				if (logsrv->level < 0) {
-					Alert("parsing [%s:%d] : unknown optional log level '%s'\n", file, linenum, args[3]);
+					Alert("parsing [%s:%d] : unknown optional log level '%s'\n", file, linenum, args[arg+3]);
 					err_code |= ERR_ALERT | ERR_FATAL;
 					goto out;
 
@@ -4814,10 +4862,10 @@
 			}
 
 			logsrv->minlvl = 0; /* limit syslog level to this level (emerg) */
-			if (*(args[4])) {
-				logsrv->minlvl = get_log_level(args[4]);
+			if (*(args[arg+4])) {
+				logsrv->minlvl = get_log_level(args[arg+4]);
 				if (logsrv->minlvl < 0) {
-					Alert("parsing [%s:%d] : unknown optional minimum log level '%s'\n", file, linenum, args[4]);
+					Alert("parsing [%s:%d] : unknown optional minimum log level '%s'\n", file, linenum, args[arg+4]);
 					err_code |= ERR_ALERT | ERR_FATAL;
 					goto out;
 
diff --git a/src/log.c b/src/log.c
index 114ab7b..3e3acb4 100644
--- a/src/log.c
+++ b/src/log.c
@@ -146,7 +146,7 @@
 /* This is a global syslog line, common to all outgoing messages. It begins
  * with the syslog tag and the date that are updated by update_log_hdr().
  */
-static char logline[MAX_SYSLOG_LEN];
+char *logline = NULL;
 
 struct logformat_var_args {
 	char *name;
@@ -736,7 +736,7 @@
 		tvsec = date.tv_sec;
 		get_localtime(tvsec, &tm);
 
-		hdr_len = snprintf(logline, MAX_SYSLOG_LEN,
+		hdr_len = snprintf(logline, global.max_syslog_len,
 				   "<<<<>%s %2d %02d:%02d:%02d %s%s[%d]: ",
 				   monthname[tm.tm_mon],
 				   tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec,
@@ -746,8 +746,8 @@
 		 * either -1 or the number of bytes that would be needed to store
 		 * the total message. In both cases, we must adjust it.
 		 */
-		if (hdr_len < 0 || hdr_len > MAX_SYSLOG_LEN)
-			hdr_len = MAX_SYSLOG_LEN;
+		if (hdr_len < 0 || hdr_len > global.max_syslog_len)
+			hdr_len = global.max_syslog_len;
 
 		dataptr = logline + hdr_len;
 	}
@@ -772,9 +772,9 @@
 	data_len = dataptr - logline;
 
 	va_start(argp, format);
-	data_len += vsnprintf(dataptr, logline + sizeof(logline) - dataptr, format, argp);
-	if (data_len < 0 || data_len > MAX_SYSLOG_LEN)
-		data_len =  MAX_SYSLOG_LEN;
+	data_len += vsnprintf(dataptr, logline + global.max_syslog_len - dataptr, format, argp);
+	if (data_len < 0 || data_len > global.max_syslog_len)
+		data_len = global.max_syslog_len;
 	va_end(argp);
 
 	__send_log(p, level, logline, data_len);
@@ -811,8 +811,6 @@
 	if (!logsrvs)
 		return;
 
-	message[size - 1] = '\n';
-
 	/* Send log messages to syslog server. */
 	nblogger = 0;
 	list_for_each_entry(tmp, logsrvs, list) {
@@ -820,6 +818,8 @@
 		int *plogfd = logsrv->addr.ss_family == AF_UNIX ?
 			&logfdunix : &logfdinet;
 		int sent;
+		int max;
+		char backup;
 
 		nblogger++;
 
@@ -858,9 +858,23 @@
 		} while (fac_level && log_ptr > dataptr);
 		*log_ptr = '<';
 
+		max = size - (log_ptr - dataptr);
+		if (max > logsrv->maxlen)
+			max = logsrv->maxlen;
+
+		/* insert a \n at the end of the message, but save what was
+		 * there first because we could have different max lengths
+		 * for different log targets.
+		 */
+		backup = log_ptr[max - 1];
+		log_ptr[max - 1] = '\n';
+
-		sent = sendto(*plogfd, log_ptr, size - (log_ptr - dataptr),
+		sent = sendto(*plogfd, log_ptr, max,
 			      MSG_DONTWAIT | MSG_NOSIGNAL,
 			      (struct sockaddr *)&logsrv->addr, get_addr_len(&logsrv->addr));
+
+		log_ptr[max - 1] = backup;
+
 		if (sent < 0) {
 			Alert("sendto logger #%d failed: %s (errno=%d)\n",
 				nblogger, strerror(errno), errno);
@@ -1604,7 +1618,7 @@
 
 	tmplog = update_log_hdr();
 	size = tmplog - logline;
-	size += build_logline(s, tmplog, sizeof(logline) - size, &s->fe->logformat);
+	size += build_logline(s, tmplog, global.max_syslog_len - size, &s->fe->logformat);
 	if (size > 0) {
 		__send_log(s->fe, level, logline, size + 1);
 		s->logs.logwait = 0;
