gboolean log_extended; /**< log extended information */
gboolean log_systemd; /**< special case for systemd logger */
gboolean log_re_cache; /**< show statistics about regexps */
+ gboolean log_usec; /**< log microseconds if possible */
guint log_error_elts; /**< number of elements in error logbuf */
guint log_error_elt_maxlen; /**< maximum size of error log element */
struct rspamd_worker_log_pipe *log_pipes;
G_STRUCT_OFFSET (struct rspamd_config, log_error_elt_maxlen),
RSPAMD_CL_FLAG_UINT,
"Size of each element in error log buffer (1000 by default)");
+ rspamd_rcl_add_default_handler (sub,
+ "log_usec",
+ rspamd_rcl_parse_struct_boolean,
+ G_STRUCT_OFFSET (struct rspamd_config, log_usec),
+ 0,
+ "Use microseconds resolution for timestamps");
/**
* Options section
*/
const gchar *message,
gpointer arg)
{
- gchar tmpbuf[256], timebuf[32], modulebuf[64];
+ gchar tmpbuf[256], timebuf[64], modulebuf[64];
gchar *m;
- time_t now;
+ gdouble now;
struct tm *tms;
struct iovec iov[5];
gulong r = 0, mr = 0;
/* Check throttling due to write errors */
if (!(level_flags & RSPAMD_LOG_FORCED) && rspamd_log->throttling) {
- now = time (NULL);
+ now = rspamd_get_calendar_ticks ();
if (rspamd_log->throttling_time != now) {
rspamd_log->throttling_time = now;
got_time = TRUE;
if (rspamd_log->cfg->log_extended) {
if (!got_time) {
- now = time (NULL);
+ now = rspamd_get_calendar_ticks ();
}
/* Format time */
if (!rspamd_log->cfg->log_systemd) {
- tms = localtime (&now);
+ time_t sec = now;
+ gsize r;
- strftime (timebuf, sizeof (timebuf), "%F %H:%M:%S", tms);
+ tms = localtime (&sec);
+ r = strftime (timebuf, sizeof (timebuf), "%F %H:%M:%S", tms);
+
+ if (rspamd_log->cfg->log_usec) {
+ gchar usec_buf[16];
+
+ rspamd_snprintf (usec_buf, sizeof (usec_buf), "%.5f",
+ now - (gdouble)sec);
+ rspamd_snprintf (timebuf + r, sizeof (timebuf) - r,
+ "%s", usec_buf + 1);
+ }
}
cptype = g_quark_to_string (rspamd_log->process_type);