*/
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;
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)
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);
rspamd_log->saved_loglevel | RSPAMD_LOG_FORCED,
tmpbuf,
r,
- rspamd_log);
+ rspamd_log,
+ rspamd_log->log_arg);
}
}
}
level_flags,
encrypted,
enc_len,
- rspamd_log);
+ rspamd_log,
+ rspamd_log->log_arg);
g_free (encrypted);
}
else {
level_flags,
logbuf,
end - logbuf,
- rspamd_log);
+ rspamd_log,
+ rspamd_log->log_arg);
}
switch (level) {
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;
gint level_flags,
const gchar *message,
gsize mlen,
+ rspamd_logger_t *rspamd_log,
gpointer arg)
{
static gchar timebuf[64], modulebuf[64];
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;
rspamd_log->saved_loglevel,
rspamd_log->saved_message,
rspamd_log->saved_mlen,
+ rspamd_log,
arg);
g_free (rspamd_log->saved_message);
rspamd_log->saved_loglevel,
tmpbuf,
r,
+ rspamd_log,
arg);
file_log_function (module, id,
level_flags,
message,
mlen,
+ rspamd_log,
arg);
rspamd_log->repeats = REPEATS_MIN + 1;
rspamd_log->saved_loglevel,
rspamd_log->saved_message,
rspamd_log->saved_mlen,
+ rspamd_log,
arg);
g_free (rspamd_log->saved_message);
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,
level_flags,
message,
mlen,
+ rspamd_log,
arg);
return;
}
G_LOG_LEVEL_DEBUG | RSPAMD_LOG_FORCED,
logbuf,
end - logbuf,
- rspamd_log);
+ rspamd_log,
+ rspamd_log->log_arg);
}
}
G_LOG_LEVEL_DEBUG | RSPAMD_LOG_FORCED,
logbuf,
end - logbuf,
- rspamd_log);
+ rspamd_log,
+ rspamd_log->log_arg);
}
}
G_LOG_LEVEL_DEBUG | RSPAMD_LOG_FORCED,
logbuf,
end - logbuf,
- rspamd_log);
+ rspamd_log,
+ rspamd_log->log_arg);
}
}
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)) {
log_level,
message,
strlen (message),
- rspamd_log);
+ rspamd_log,
+ rspamd_log->log_arg);
}
}
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
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
/**
*/
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;