From 8b63ddb68a39d48ebb621d76a2b1f07f5ff67ac7 Mon Sep 17 00:00:00 2001 Message-Id: <8b63ddb68a39d48ebb621d76a2b1f07f5ff67ac7.1574264572.git.Jim.Somerville@windriver.com> From: systemd team Date: Tue, 8 Nov 2016 17:06:01 -0500 Subject: [PATCH 1/3] inject millisec in syslog date Signed-off-by: Jim Somerville --- src/journal/journald-syslog.c | 48 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/src/journal/journald-syslog.c b/src/journal/journald-syslog.c index 1a9db59..36288cb 100644 --- a/src/journal/journald-syslog.c +++ b/src/journal/journald-syslog.c @@ -25,6 +25,43 @@ /* 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; + if (!localtime_r(&t, &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, @@ -125,8 +162,6 @@ void server_forward_syslog(Server *s, in char header_priority[DECIMAL_STR_MAX(priority) + 3], header_time[64], header_pid[STRLEN("[]: ") + DECIMAL_STR_MAX(pid_t) + 1]; int n = 0; - time_t t; - struct tm tm; _cleanup_free_ char *ident_buf = NULL; assert(s); @@ -141,12 +176,11 @@ void server_forward_syslog(Server *s, in xsprintf(header_priority, "<%i>", priority); 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 */ -- 1.8.3.1