]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Feature] Allow to log severity level explicitly
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 13 May 2021 13:58:11 +0000 (14:58 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 13 May 2021 13:58:11 +0000 (14:58 +0100)
src/libserver/cfg_file.h
src/libserver/cfg_rcl.c
src/libserver/logger/logger.c
src/libserver/logger/logger_console.c
src/libserver/logger/logger_file.c
src/libserver/logger/logger_private.h

index 67f18e1e99e9197efc825cc3aab7124ba619635d..5525030b0ce6b8a946a7fd8236c946d55f45b274 100644 (file)
@@ -76,6 +76,7 @@ enum rspamd_log_cfg_flags {
        RSPAMD_LOG_FLAG_USEC = (1 << 3),
        RSPAMD_LOG_FLAG_RSPAMADM = (1 << 4),
        RSPAMD_LOG_FLAG_ENFORCED = (1 << 5),
+       RSPAMD_LOG_FLAG_SEVERITY = (1 << 6),
 };
 
 struct rspamd_worker_log_pipe {
index 4891c4194eb94d61777eb405cbdb453bcd9d2604..fdd7e455a4a819fd040bfe7f146a72817ea19c16 100644 (file)
@@ -238,6 +238,11 @@ rspamd_rcl_logging_handler (rspamd_mempool_t *pool, const ucl_object_t *obj,
                cfg->log_flags |= RSPAMD_LOG_FLAG_COLOR;
        }
 
+       val = ucl_object_lookup_any (obj, "severity", "log_severity", NULL);
+       if (val && ucl_object_toboolean (val)) {
+               cfg->log_flags |= RSPAMD_LOG_FLAG_SEVERITY;
+       }
+
        val = ucl_object_lookup_any (obj, "systemd", "log_systemd", NULL);
        if (val && ucl_object_toboolean (val)) {
                cfg->log_flags |= RSPAMD_LOG_FLAG_SYSTEMD;
@@ -1778,6 +1783,15 @@ rspamd_rcl_config_init (struct rspamd_config *cfg, GHashTable *skip_sections)
                                0,
                                NULL,
                                0);
+               rspamd_rcl_add_doc_by_path (cfg,
+                               "logging",
+                               "Enable severity logging output (e.g. [error] or [warning])",
+                               "log_severity",
+                               UCL_BOOLEAN,
+                               NULL,
+                               0,
+                               NULL,
+                               0);
                rspamd_rcl_add_doc_by_path (cfg,
                                "logging",
                                "Enable systemd compatible logging",
index 0ab6c478959a99755e0956706b206f35d9136ea8..0c7400ebf87342ed5c9ded92181dde18df934849 100644 (file)
@@ -999,4 +999,28 @@ rspamd_log_line_need_escape (const guchar *src, gsize srclen)
        }
 
        return n;
+}
+
+const gchar *
+rspamd_get_log_severity_string (gint level_flags)
+{
+       unsigned int bitnum;
+       static const char *level_strs[G_LOG_LEVEL_USER_SHIFT] = {
+                       "", /* G_LOG_FLAG_RECURSION */
+                       "", /* G_LOG_FLAG_FATAL */
+                       "crit",
+                       "error",
+                       "warn",
+                       "notice",
+                       "info",
+                       "debug"
+       };
+       level_flags &= ((1u << G_LOG_LEVEL_USER_SHIFT) - 1u) & ~(G_LOG_FLAG_RECURSION|G_LOG_FLAG_FATAL);
+#ifdef __GNUC__
+       /* We assume gcc >= 3 and clang >= 5 anyway */
+       bitnum = __builtin_ffs (level_flags) - 1;
+#else
+       bitnum = ffs (level_flags) - 1;
+#endif
+       return level_strs[bitnum];
 }
\ No newline at end of file
index c7857bdfeff423d8d808559e5249e371801485d7..3e142fe27e1b9fcc5f2c87617454ea6bf8f6d2ed 100644 (file)
@@ -28,6 +28,7 @@ static const gchar lf_chr = '\n';
 struct rspamd_console_logger_priv {
        gint fd;
        gint crit_fd;
+       gboolean log_severity;
        gboolean log_color;
        gboolean log_rspamadm;
        gboolean log_tty;
@@ -63,6 +64,7 @@ rspamd_log_console_init (rspamd_logger_t *logger, struct rspamd_config *cfg,
 
        priv = g_malloc0 (sizeof (*priv));
        priv->log_color = (logger->flags & RSPAMD_LOG_FLAG_COLOR);
+       priv->log_severity = (logger->flags & RSPAMD_LOG_FLAG_SEVERITY);
        priv->log_rspamadm = (logger->flags & RSPAMD_LOG_FLAG_RSPAMADM);
 
        if (priv->log_rspamadm) {
@@ -224,12 +226,23 @@ rspamd_log_console_log (const gchar *module, const gchar *id,
        }
        else {
                if (!(rspamd_log->flags & RSPAMD_LOG_FLAG_SYSTEMD)) {
-                       r += rspamd_snprintf (tmpbuf + r,
-                                       sizeof (tmpbuf) - r,
-                                       "%s #%P(%s) ",
-                                       timebuf,
-                                       rspamd_log->pid,
-                                       rspamd_log->process_type);
+                       if (priv->log_severity) {
+                               r += rspamd_snprintf(tmpbuf + r,
+                                               sizeof(tmpbuf) - r,
+                                               "%s [%s] #%P(%s) ",
+                                               timebuf,
+                                               rspamd_get_log_severity_string (level_flags),
+                                               rspamd_log->pid,
+                                               rspamd_log->process_type);
+                       }
+                       else {
+                               r += rspamd_snprintf(tmpbuf + r,
+                                               sizeof(tmpbuf) - r,
+                                               "%s #%P(%s) ",
+                                               timebuf,
+                                               rspamd_log->pid,
+                                               rspamd_log->process_type);
+                       }
                } else {
                        r += rspamd_snprintf (tmpbuf + r,
                                        sizeof (tmpbuf) - r,
index 3d5cc148b7b0c04ba41e12de7c330a1d3460ca76..81c44f8e745e9cb1e3efd7ed113913bac85b39ed 100644 (file)
@@ -36,6 +36,7 @@ struct rspamd_file_logger_priv {
        gboolean throttling;
        gchar *log_file;
        gboolean is_buffered;
+       gboolean log_severity;
        time_t throttling_time;
        guint32 repeats;
        guint64 last_line_cksum;
@@ -360,6 +361,7 @@ rspamd_log_file_init (rspamd_logger_t *logger, struct rspamd_config *cfg,
                priv->log_file = g_strdup (cfg->log_file);
        }
 
+       priv->log_severity = (logger->flags & RSPAMD_LOG_FLAG_SEVERITY);
        priv->fd = rspamd_try_open_log_fd (logger, priv, uid, gid, err);
 
        if (priv->fd == -1) {
@@ -506,12 +508,23 @@ rspamd_log_file_log (const gchar *module, const gchar *id,
        r = 0;
 
        if (!(rspamd_log->flags & RSPAMD_LOG_FLAG_SYSTEMD)) {
-               r += rspamd_snprintf (tmpbuf + r,
-                               sizeof (tmpbuf) - r,
-                               "%s #%P(%s) ",
-                               timebuf,
-                               rspamd_log->pid,
-                               cptype);
+               if (priv->log_severity) {
+                       r += rspamd_snprintf(tmpbuf + r,
+                                       sizeof(tmpbuf) - r,
+                                       "%s [%s] #%P(%s) ",
+                                       timebuf,
+                                       rspamd_get_log_severity_string (level_flags),
+                                       rspamd_log->pid,
+                                       cptype);
+               }
+               else {
+                       r += rspamd_snprintf(tmpbuf + r,
+                                       sizeof(tmpbuf) - r,
+                                       "%s #%P(%s) ",
+                                       timebuf,
+                                       rspamd_log->pid,
+                                       cptype);
+               }
        }
        else {
                r += rspamd_snprintf (tmpbuf + r,
index cb06abe7cfff37b47ffa8cca47f704317378d5f1..92bdfdba7b1dd3bd88b1cddd731f54d8828d7768 100644 (file)
@@ -168,6 +168,7 @@ bool rspamd_log_console_log (const gchar *module, const gchar *id,
                                                        gsize mlen,
                                                        rspamd_logger_t *rspamd_log,
                                                        gpointer arg);
+const gchar *rspamd_get_log_severity_string(gint level_flags);
 
 static const struct rspamd_logger_funcs console_log_funcs = {
                .init = rspamd_log_console_init,