]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Project] Allow to set a custom log function to the logger
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 10 Feb 2020 12:15:23 +0000 (12:15 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 10 Feb 2020 21:12:13 +0000 (21:12 +0000)
src/libutil/logger.c
src/libutil/logger.h

index d023b7ab2d0144c6364749da887e1f6c4b43e01e..cb1e392092a6aecfed48a5f5b0581d1000bdc42d 100644 (file)
@@ -69,6 +69,7 @@ struct rspamd_logger_error_log {
  */
 struct rspamd_logger_s {
        rspamd_log_func_t log_func;
+       gpointer log_arg;
        enum rspamd_log_type log_type;
        gint log_facility;
        gint log_level;
@@ -116,14 +117,16 @@ static rspamd_logger_t *default_logger = NULL;
 static struct rspamd_log_modules *log_modules = NULL;
 
 static void syslog_log_function (const gchar *module,
-               const gchar *id, const gchar *function,
-               gint log_level, const gchar *message, gsize mlen,
-               gpointer arg);
+                                                                const gchar *id, const gchar *function,
+                                                                gint log_level, const gchar *message, gsize mlen,
+                                                                rspamd_logger_t *logger,
+                                                                gpointer arg);
 
 static void file_log_function (const gchar *module,
-               const gchar *id, const gchar *function,
-               gint log_level, const gchar *message, gsize mlen,
-               gpointer arg);
+                                                          const gchar *id, const gchar *function,
+                                                          gint log_level, const gchar *message, gsize mlen,
+                                                          rspamd_logger_t *logger,
+                                                          gpointer arg);
 
 guint rspamd_task_log_id = (guint)-1;
 RSPAMD_CONSTRUCTOR(rspamd_task_log_init)
@@ -397,7 +400,8 @@ rspamd_log_reset_repeated (rspamd_logger_t *rspamd_log)
                                                        rspamd_log->saved_loglevel | RSPAMD_LOG_FORCED,
                                                        rspamd_log->saved_message,
                                                        rspamd_log->saved_mlen,
-                                                       rspamd_log);
+                                                       rspamd_log,
+                                                       rspamd_log->log_arg);
 
                                        g_free (rspamd_log->saved_message);
                                        g_free (rspamd_log->saved_function);
@@ -415,7 +419,8 @@ rspamd_log_reset_repeated (rspamd_logger_t *rspamd_log)
                                                rspamd_log->saved_loglevel | RSPAMD_LOG_FORCED,
                                                tmpbuf,
                                                r,
-                                               rspamd_log);
+                                               rspamd_log,
+                                               rspamd_log->log_arg);
                        }
                }
        }
@@ -851,7 +856,8 @@ rspamd_common_logv (rspamd_logger_t *rspamd_log, gint level_flags,
                                                level_flags,
                                                encrypted,
                                                enc_len,
-                                               rspamd_log);
+                                               rspamd_log,
+                                               rspamd_log->log_arg);
                                g_free (encrypted);
                        }
                        else {
@@ -860,7 +866,8 @@ rspamd_common_logv (rspamd_logger_t *rspamd_log, gint level_flags,
                                                level_flags,
                                                logbuf,
                                                end - logbuf,
-                                               rspamd_log);
+                                               rspamd_log,
+                                               rspamd_log->log_arg);
                        }
 
                        switch (level) {
@@ -990,9 +997,9 @@ syslog_log_function (const gchar *module, const gchar *id,
                gint level_flags,
                const gchar *message,
                gsize mlen,
+               rspamd_logger_t *rspamd_log,
                gpointer arg)
 {
-       rspamd_logger_t *rspamd_log = arg;
 #ifdef HAVE_SYSLOG_H
        struct {
                GLogLevelFlags glib_level;
@@ -1058,6 +1065,7 @@ file_log_function (const gchar *module, const gchar *id,
                gint level_flags,
                const gchar *message,
                gsize mlen,
+               rspamd_logger_t *rspamd_log,
                gpointer arg)
 {
        static gchar timebuf[64], modulebuf[64];
@@ -1071,7 +1079,6 @@ file_log_function (const gchar *module, const gchar *id,
        size_t mremain;
        const gchar *cptype = NULL;
        gboolean got_time = FALSE;
-       rspamd_logger_t *rspamd_log = arg;
 
        if (!(level_flags & RSPAMD_LOG_FORCED) && !rspamd_log->enabled) {
                return;
@@ -1132,6 +1139,7 @@ file_log_function (const gchar *module, const gchar *id,
                                                        rspamd_log->saved_loglevel,
                                                        rspamd_log->saved_message,
                                                        rspamd_log->saved_mlen,
+                                                       rspamd_log,
                                                        arg);
 
                                        g_free (rspamd_log->saved_message);
@@ -1150,6 +1158,7 @@ file_log_function (const gchar *module, const gchar *id,
                                                rspamd_log->saved_loglevel,
                                                tmpbuf,
                                                r,
+                                               rspamd_log,
                                                arg);
 
                                file_log_function (module, id,
@@ -1157,6 +1166,7 @@ file_log_function (const gchar *module, const gchar *id,
                                                level_flags,
                                                message,
                                                mlen,
+                                               rspamd_log,
                                                arg);
 
                                rspamd_log->repeats = REPEATS_MIN + 1;
@@ -1181,6 +1191,7 @@ file_log_function (const gchar *module, const gchar *id,
                                                        rspamd_log->saved_loglevel,
                                                        rspamd_log->saved_message,
                                                        rspamd_log->saved_mlen,
+                                                       rspamd_log,
                                                        arg);
 
                                        g_free (rspamd_log->saved_message);
@@ -1198,6 +1209,7 @@ file_log_function (const gchar *module, const gchar *id,
                                                level_flags,
                                                tmpbuf,
                                                r,
+                                               rspamd_log,
                                                arg);
                                /* It is safe to use temporary buffer here as it is not static */
                                file_log_function (module, id,
@@ -1205,6 +1217,7 @@ file_log_function (const gchar *module, const gchar *id,
                                                level_flags,
                                                message,
                                                mlen,
+                                               rspamd_log,
                                                arg);
                                return;
                        }
@@ -1395,7 +1408,8 @@ rspamd_conditional_debug (rspamd_logger_t *rspamd_log,
                                G_LOG_LEVEL_DEBUG | RSPAMD_LOG_FORCED,
                                logbuf,
                                end - logbuf,
-                               rspamd_log);
+                               rspamd_log,
+                               rspamd_log->log_arg);
        }
 }
 
@@ -1431,7 +1445,8 @@ rspamd_conditional_debug_fast (rspamd_logger_t *rspamd_log,
                                G_LOG_LEVEL_DEBUG | RSPAMD_LOG_FORCED,
                                logbuf,
                                end - logbuf,
-                               rspamd_log);
+                               rspamd_log,
+                               rspamd_log->log_arg);
        }
 }
 
@@ -1468,7 +1483,8 @@ rspamd_conditional_debug_fast_num_id (rspamd_logger_t *rspamd_log,
                                G_LOG_LEVEL_DEBUG | RSPAMD_LOG_FORCED,
                                logbuf,
                                end - logbuf,
-                               rspamd_log);
+                               rspamd_log,
+                               rspamd_log->log_arg);
        }
 }
 
@@ -1481,7 +1497,7 @@ rspamd_glib_log_function (const gchar *log_domain,
                const gchar *message,
                gpointer arg)
 {
-       rspamd_logger_t *rspamd_log = arg;
+       rspamd_logger_t *rspamd_log = (rspamd_logger_t *)arg;
 
        if (rspamd_log->enabled &&
                        rspamd_logger_need_log (rspamd_log, log_level, -1)) {
@@ -1490,7 +1506,8 @@ rspamd_glib_log_function (const gchar *log_domain,
                                log_level,
                                message,
                                strlen (message),
-                               rspamd_log);
+                               rspamd_log,
+                               rspamd_log->log_arg);
        }
 }
 
@@ -1688,4 +1705,28 @@ rspamd_logger_t*
 rspamd_logger_get_singleton (void)
 {
        return default_logger;
+}
+
+rspamd_log_func_t
+rspamd_logger_set_log_function (rspamd_logger_t *logger,
+                                                               rspamd_log_func_t nfunc,
+                                                               gpointer narg,
+                                                               gpointer *old_arg)
+{
+       if (logger == NULL) {
+               logger = default_logger;
+       }
+
+       g_assert (logger != NULL);
+
+       if (old_arg) {
+               *old_arg = logger->log_arg;
+       }
+
+       rspamd_log_func_t old_func = logger->log_func;
+
+       logger->log_func = nfunc;
+       logger->log_arg = narg;
+
+       return old_func;
 }
\ No newline at end of file
index 13ae76b0065eae00fb35e4588cec1e6ed5b995e1..d2c690392af90f416fc9592f42b775a12697d4bb 100644 (file)
@@ -21,15 +21,15 @@ enum rspamd_log_flags {
        RSPAMD_LOG_LEVEL_MASK = ~(RSPAMD_LOG_FORCED | RSPAMD_LOG_ENCRYPTED)
 };
 
+typedef struct rspamd_logger_s rspamd_logger_t;
 typedef void (*rspamd_log_func_t) (const gchar *module, const gchar *id,
                                                                   const gchar *function,
                                                                   gint level_flags,
                                                                   const gchar *message,
                                                                   gsize mlen,
+                                                                  rspamd_logger_t *logger,
                                                                   gpointer arg);
 
-typedef struct rspamd_logger_s rspamd_logger_t;
-
 #define RSPAMD_LOGBUF_SIZE 8192
 
 /**
@@ -199,6 +199,19 @@ ucl_object_t *rspamd_log_errorbuf_export (const rspamd_logger_t *logger);
  */
 rspamd_logger_t *rspamd_logger_get_singleton (void);
 
+/**
+ * Sets new logging function
+ * @param logger
+ * @param nfunc
+ * @param narg
+ * @param old_arg
+ * @return old log function and old log function arg in (*old_arg)
+ */
+rspamd_log_func_t rspamd_logger_set_log_function (rspamd_logger_t *logger,
+                                                                                                  rspamd_log_func_t nfunc,
+                                                                                                  gpointer narg,
+                                                                                                  gpointer *old_arg);
+
 /* Typical functions */
 
 extern guint rspamd_task_log_id;