From 5ef6dbb951246912ba021f9e2edacd0f9e7619e6 Mon Sep 17 00:00:00 2001 From: "Sar Ashki, Babak" Date: Sat, 29 Feb 2020 12:48:57 -0800 Subject: [PATCH] inject milisec in syslog date From stx.3.0: 0231aba5cdcb96b15106591acfff280159050366 --- src/journal/journald-syslog.c | 45 +++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/src/journal/journald-syslog.c b/src/journal/journald-syslog.c index a60a259bc4..0036750353 100644 --- a/src/journal/journald-syslog.c +++ b/src/journal/journald-syslog.c @@ -25,6 +25,44 @@ /* Warn once every 30s if we missed syslog message */ #define WARN_FORWARD_SYSLOG_MISSED_USEC (30 * USEC_PER_SEC) +/* internal function that builds a formatted time str of the + * tv parameter into the passed buffer. (ie Nov 7 16:28:38.109) + * If tv is NULL, then the clock function is used to build the formatted time + * returns (same as snprintf) - number of characters written to buffer. + */ +static int formatSyslogDate(char * buffer, int bufLen, const struct timeval *tv) { + struct timeval tv_tmp; + long int millisec; + char tmpbuf[64]; + struct tm *tm; + time_t t; + + if (!tv) { + // no timeval input so get time data from clock + usec_t now_usec = now(CLOCK_REALTIME); + time_t now_sec = ((time_t) now_usec / USEC_PER_SEC); + long int now_fraction_secs = now_usec % USEC_PER_SEC; + tv_tmp.tv_sec = now_sec; + tv_tmp.tv_usec = now_fraction_secs; + tv = &tv_tmp; + } + + t = tv->tv_sec; + tm = localtime(&t); + if (!tm) + return 0; + + // format time to the second granularity - ie Nov 7 16:28:38 + if (strftime(tmpbuf,sizeof(tmpbuf),"%h %e %T", tm) <= 0) + return 0; + + millisec = tv->tv_usec / 1000; + // now append millisecond granularity (ie Nov 7 16:28:38.109) to + // the formatted string. + return snprintf(buffer, bufLen, "%s.%03lu", tmpbuf, millisec); +} + + static void forward_syslog_iovec(Server *s, const struct iovec *iovec, unsigned n_iovec, const struct ucred *ucred, const struct timeval *tv) { static const union sockaddr_union sa = { @@ -133,11 +171,8 @@ void server_forward_syslog(Server *s, int priority, const char *identifier, cons iovec[n++] = IOVEC_MAKE_STRING(header_priority); /* Second: timestamp */ - t = tv ? tv->tv_sec : ((time_t) (now(CLOCK_REALTIME) / USEC_PER_SEC)); - if (!localtime_r(&t, &tm)) - return; - if (strftime(header_time, sizeof(header_time), "%h %e %T ", &tm) <= 0) - return; + if (formatSyslogDate(header_time, sizeof(header_time), tv) <=0 ) + return; iovec[n++] = IOVEC_MAKE_STRING(header_time); /* Third: identifier and PID */ -- 2.23.0