makes sense on its own.
### console\_timestamps
-> `= none | date | boot`
+> `= none | date | datems | boot`
> Default: `none`
* `none`: No timestamps
* `date`: Date and time information
* `[YYYY-MM-DD HH:MM:SS]`
+* `datems`: Date and time, with milliseconds
+ * `[YYYY-MM-DD HH:MM:SS.mmm]`
* `boot`: Seconds and microseconds since boot
* `[SSSSSS.uuuuuu]`
return 0;
}
-struct tm wallclock_time(void)
+struct tm wallclock_time(uint64_t *ns)
{
- uint64_t seconds;
+ uint64_t seconds, nsec;
if ( !wc_sec )
return (struct tm) { 0 };
seconds = NOW() + SECONDS(wc_sec) + wc_nsec;
- do_div(seconds, 1000000000);
+ nsec = do_div(seconds, 1000000000);
+
+ if ( ns )
+ *ns = nsec;
+
return gmtime(seconds);
}
{
TSM_NONE, /* No timestamps */
TSM_DATE, /* [YYYY-MM-DD HH:MM:SS] */
+ TSM_DATE_MS, /* [YYYY-MM-DD HH:MM:SS.mmm] */
TSM_BOOT /* [SSSSSS.uuuuuu] */
};
if ( *s == '\0' || /* Compat for old booleanparam() */
!strcmp(s, "date") )
opt_con_timestamp_mode = TSM_DATE;
+ else if ( !strcmp(s, "datems") )
+ opt_con_timestamp_mode = TSM_DATE_MS;
else if ( !strcmp(s, "boot") )
opt_con_timestamp_mode = TSM_BOOT;
else if ( !strcmp(s, "none") )
switch ( opt_con_timestamp_mode )
{
case TSM_DATE:
- tm = wallclock_time();
+ case TSM_DATE_MS:
+ tm = wallclock_time(&nsec);
if ( tm.tm_mday == 0 )
return;
snprintf(tstr, sizeof(tstr), "[%04u-%02u-%02u %02u:%02u:%02u] ",
1900 + tm.tm_year, tm.tm_mon + 1, tm.tm_mday,
tm.tm_hour, tm.tm_min, tm.tm_sec);
+ else
+ snprintf(tstr, sizeof(tstr),
+ "[%04u-%02u-%02u %02u:%02u:%02u.%03"PRIu64"] ",
+ 1900 + tm.tm_year, tm.tm_mon + 1, tm.tm_mday,
+ tm.tm_hour, tm.tm_min, tm.tm_sec, nsec / 1000000);
break;
case TSM_BOOT:
int tm_isdst; /* daylight saving time */
};
struct tm gmtime(unsigned long t);
-struct tm wallclock_time(void);
+struct tm wallclock_time(uint64_t *ns);
#define SYSTEM_TIME_HZ 1000000000ULL
#define NOW() ((s_time_t)get_s_time())