Add backwards compatibility handling with sysklogd v1.6

This patch adds compatibility with sysklgd v1.6 and also adds the new
action flag "RFC3164" to explicitly be able to set old format.  This
format is the default, except for remote syslog.  Also, the rotation
support added in v1.6 has chnaged syntax which this patch addresses.

- Remote syslog defaults to BSD format, w/o timestamp and hostname
- Support reading log rotation without ';rotate=' prefix

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
This commit is contained in:
Joachim Nilsson 2019-11-06 12:08:42 +01:00
parent 02a67ef273
commit 65ac085a97
2 changed files with 64 additions and 19 deletions

View File

@ -1448,23 +1448,28 @@ void logrotate(struct filed *f)
bm->pri, bm->flags, bm->hostname, bm->app_name, \
bm->proc_id, bm->msgid, bm->sd, bm->msg)
static int fmt3164(struct buf_msg *buffer, struct iovec *iov, size_t iovmax)
static int fmt3164(struct buf_msg *buffer, char *fmt, struct iovec *iov, size_t iovmax)
{
int i = 0;
fmtlogit(buffer);
strftime(buffer->timebuf, sizeof(buffer->timebuf), RFC3164_DATEFMT,
&buffer->timestamp.tm);
snprintf(buffer->pribuf, sizeof(buffer->pribuf), "<%d>", buffer->pri);
pushiov(iov, i, buffer->pribuf);
pushsp(iov, i);
/*
* sysklogd < 2.0 had the traditional BSD format for remote syslog
* which did not include the timestamp or the hostname.
*/
if (fmt) {
strftime(buffer->timebuf, sizeof(buffer->timebuf), fmt, &buffer->timestamp.tm);
pushiov(iov, i, buffer->timebuf);
pushsp(iov, i);
pushiov(iov, i, buffer->hostname ? buffer->hostname : buffer->recvhost);
pushsp(iov, i);
}
if (buffer->app_name) {
pushiov(iov, i, buffer->app_name);
@ -1481,14 +1486,14 @@ static int fmt3164(struct buf_msg *buffer, struct iovec *iov, size_t iovmax)
return i;
}
static int fmt5424(struct buf_msg *buffer, struct iovec *iov, size_t iovmax)
/* <PRI>1 2003-08-24T05:14:15.000003-07:00 hostname app-name procid msgid sd msg */
static int fmt5424(struct buf_msg *buffer, char *fmt, struct iovec *iov, size_t iovmax)
{
suseconds_t usec;
int i = 0;
fmtlogit(buffer);
strftime(buffer->timebuf, sizeof(buffer->timebuf), "%FT%T.______%z",
&buffer->timestamp.tm);
strftime(buffer->timebuf, sizeof(buffer->timebuf), fmt, &buffer->timestamp.tm);
/* Add colon to the time zone offset, which %z doesn't do */
buffer->timebuf[32] = '\0';
@ -1576,9 +1581,11 @@ void fprintlog(struct filed *f, struct buf_msg *buffer)
}
if (f->f_flags & RFC5424)
iovcnt = fmt5424(buffer, iov, NELEMS(iov));
iovcnt = fmt5424(buffer, RFC5424_DATEFMT, iov, NELEMS(iov));
else if (f->f_flags & RFC3164)
iovcnt = fmt3164(buffer, RFC3164_DATEFMT, iov, NELEMS(iov));
else
iovcnt = fmt3164(buffer, iov, NELEMS(iov));
iovcnt = fmt3164(buffer, BSDFMT_DATEFMT, iov, NELEMS(iov));
/* Save actual message for future repeats */
// if (iovcnt > 0)
@ -2400,19 +2407,25 @@ static void cfopts(char *ptr, struct filed *f)
if (!ptr)
return;
/* Insert NUL character after action */
/* Insert NUL character to terminate file/host names */
if (*ptr != ';')
*ptr++ = 0;
/* Parse options */
opt = strtok(ptr, ";");
if (!opt)
return;
while (opt) {
if (cfopt(&opt, "RFC5424"))
if (cfopt(&opt, "RFC5424")) {
f->f_flags |= RFC5424;
else if (cfopt(&opt, "RFC3164"))
f->f_flags &= ~RFC3164;
} else if (cfopt(&opt, "RFC3164")) {
f->f_flags &= ~RFC5424;
else if (cfopt(&opt, "rotate="))
f->f_flags |= RFC3164;
} else if (cfopt(&opt, "rotate="))
cfrot(opt, f);
else
cfrot(ptr, f); /* Compat v1.6 syntax */
opt = strtok(NULL, ",");
}
@ -2650,6 +2663,30 @@ static struct filed *cfline(char *line)
break;
}
/* Set default log format, unless format was already specified */
switch (f->f_type) {
case F_FORW:
case F_FORW_UNKN:
/* Remote syslog defaults to BSD style, i.e. no timestamp or hostname */
break;
default:
/* All other targets default to RFC3164 */
if (f->f_flags & (RFC3164 | RFC5424)) {
logit("%s has %s format logging enabled\n",
(f->f_flags & RFC3164) ? "RFC3164" : "RFC5424");
break;
}
f->f_flags = RFC3164;
break;
}
if (f->f_flags & (RFC3164 | RFC5424))
logit("%s format enabled\n", (f->f_flags & RFC3164) ? "RFC3164" : "RFC5424");
else
logit("BSD format enabled\n");
return f;
}

View File

@ -112,11 +112,19 @@
#define SYNC_FILE 0x002 /* do fsync on file after printing */
#define ADDDATE 0x004 /* add a date to the message */
#define MARK 0x008 /* this message is a mark */
#define RFC5424 0x010 /* format log message according to RFC 5424 */
#define RFC3164 0x010 /* format log message according to RFC 3164 */
#define RFC5424 0x020 /* format log message according to RFC 5424 */
/* Syslog timestamp formats. */
#define BSDFMT_DATELEN 0
#define BSDFMT_DATEFMT NULL
#define RFC3164_DATELEN 15
#define RFC3164_DATEFMT "%b %e %H:%M:%S"
#define RFC5424_DATELEN 32
#define RFC5424_DATEFMT "%FT%T.______%z"
/*
* Helper macros for "message repeated" messages
*/