diff --git a/drivers/syslog/Kconfig b/drivers/syslog/Kconfig index b79fdd3106..93651f189a 100644 --- a/drivers/syslog/Kconfig +++ b/drivers/syslog/Kconfig @@ -111,6 +111,37 @@ config SYSLOG_TIMESTAMP_REALTIME CLOCK_MONOTONIC, if enabled, will be used or the system timer is not. +config SYSLOG_TIMESTAMP_FORMATTED + bool "Formatted syslog time" + default n + depends on SYSLOG_TIMESTAMP_REALTIME + ---help--- + Syslog timestamp will be formatted according to the + SYSLOG_TIMESTAMP_FORMAT format string. + +config SYSLOG_TIMESTAMP_LOCALTIME + bool "Use local-time timestamp" + default n + depends on SYSLOG_TIMESTAMP_FORMATTED + ---help--- + If selected local time will be used for the timestamps. + Else, timestamps will be in UTC. + +config SYSLOG_TIMESTAMP_FORMAT + string "Time format" + default "%e/%m/%y %H:%M:%S" + depends on SYSLOG_TIMESTAMP_FORMATTED + ---help--- + Formatter string for syslog timestamp printing. + Uses the standard "strftime" format specifiers. + +config SYSLOG_TIMESTAMP_BUFFER + int "Formatted timestamp buffer size" + default 64 + depends on SYSLOG_TIMESTAMP_FORMATTED + ---help--- + Buffer size to store syslog formatted timestamps. + config SYSLOG_PREFIX bool "Prepend prefix to syslog message" default n diff --git a/drivers/syslog/vsyslog.c b/drivers/syslog/vsyslog.c index e6cf91716c..893a79ab47 100644 --- a/drivers/syslog/vsyslog.c +++ b/drivers/syslog/vsyslog.c @@ -71,6 +71,11 @@ int nx_vsyslog(int priority, FAR const IPTR char *fmt, FAR va_list *ap) { struct lib_syslogstream_s stream; int ret; +#if defined(CONFIG_SYSLOG_TIMESTAMP_FORMATTED) + time_t time; + struct tm tm; + char date_buf[CONFIG_SYSLOG_TIMESTAMP_BUFFER]; +#endif #ifdef CONFIG_SYSLOG_TIMESTAMP struct timespec ts; @@ -132,8 +137,25 @@ int nx_vsyslog(int priority, FAR const IPTR char *fmt, FAR va_list *ap) #if defined(CONFIG_SYSLOG_TIMESTAMP) /* Pre-pend the message with the current time, if available */ +#if defined(CONFIG_SYSLOG_TIMESTAMP_FORMATTED) + time = ts.tv_sec; +#if defined(CONFIG_SYSLOG_TIMESTAMP_LOCALTIME) + localtime_r(&time, &tm); +#else + gmtime_r(&time, &tm); +#endif + + ret = strftime(date_buf, CONFIG_SYSLOG_TIMESTAMP_BUFFER, + CONFIG_SYSLOG_TIMESTAMP_FORMAT, &tm); + + if (ret > 0) + { + ret = lib_sprintf(&stream.public, "[%s] ", date_buf); + } +#else ret = lib_sprintf(&stream.public, "[%5jd.%06ld] ", (uintmax_t)ts.tv_sec, ts.tv_nsec / 1000); +#endif #else ret = 0; #endif