aboutsummaryrefslogtreecommitdiffstats
path: root/src/libutil/logger.c
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2018-01-20 12:39:37 +0000
committerVsevolod Stakhov <vsevolod@highsecure.ru>2018-01-20 12:39:37 +0000
commitef80118079258610197e5a1432e1a14610fb6006 (patch)
treecb38a616b48ab78ece45a1ec8cda49c190ce6839 /src/libutil/logger.c
parentcf58caf06a1813eff48363b559ad18fb01ddaa90 (diff)
downloadrspamd-ef80118079258610197e5a1432e1a14610fb6006.tar.gz
rspamd-ef80118079258610197e5a1432e1a14610fb6006.zip
[Project] Add fast debug logging infrastructure
Diffstat (limited to 'src/libutil/logger.c')
-rw-r--r--src/libutil/logger.c80
1 files changed, 78 insertions, 2 deletions
diff --git a/src/libutil/logger.c b/src/libutil/logger.c
index 7bfd85183..bc9cb3a46 100644
--- a/src/libutil/logger.c
+++ b/src/libutil/logger.c
@@ -29,6 +29,18 @@
#define REPEATS_MAX 300
#define LOG_ID 6
+struct rspamd_log_module {
+ gchar *mname;
+ guint id;
+};
+
+struct rspamd_log_modules {
+ guchar *bitset;
+ guint bitset_len;
+ guint bitset_allocated;
+ GHashTable *modules;
+};
+
struct rspamd_logger_error_elt {
gint completed;
GQuark ptype;
@@ -90,14 +102,14 @@ struct rspamd_logger_s {
static const gchar lf_chr = '\n';
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,
gpointer arg);
-static void
- file_log_function (const gchar *module,
+static void file_log_function (const gchar *module,
const gchar *id, const gchar *function,
gint log_level, const gchar *message,
gpointer arg);
@@ -1273,3 +1285,67 @@ rspamd_log_errorbuf_export (const rspamd_logger_t *logger)
return top;
}
+
+static guint
+rspamd_logger_allocate_mod_bit (void)
+{
+ if (log_modules->bitset_allocated * NBBY > log_modules->bitset_len + 1) {
+ log_modules->bitset_len ++;
+ return log_modules->bitset_len - 1;
+ }
+ else {
+ /* Need to expand */
+ log_modules->bitset_allocated *= 2;
+ log_modules->bitset = g_realloc (log_modules->bitset,
+ log_modules->bitset_allocated);
+
+ return rspamd_logger_allocate_mod_bit ();
+ }
+}
+
+guint
+rspamd_logger_add_debug_module (const gchar *mname)
+{
+ struct rspamd_log_module *m;
+
+ if (log_modules == NULL) {
+ log_modules = g_malloc0 (sizeof (*log_modules));
+ log_modules->modules = g_hash_table_new (rspamd_strcase_hash,
+ rspamd_strcase_equal);
+ log_modules->bitset_allocated = 16;
+ log_modules->bitset_len = 0;
+ log_modules->bitset = g_malloc0 (log_modules->bitset_allocated);
+ }
+
+ if ((m = g_hash_table_lookup (log_modules->modules, mname)) == NULL) {
+ m = g_malloc0 (sizeof (*m));
+ m->mname = g_strdup (mname);
+ m->id = rspamd_logger_allocate_mod_bit ();
+ }
+
+ return m->id;
+}
+
+void
+rspamd_logger_configure_modules (GHashTable *mods_enabled)
+{
+ GHashTableIter it;
+ gpointer k, v;
+ guint id;
+
+ /* On first iteration, we go through all modules enabled and add missing ones */
+ g_hash_table_iter_init (&it, mods_enabled);
+
+ while (g_hash_table_iter_next (&it, &k, &v)) {
+ rspamd_logger_add_debug_module ((const gchar *)k);
+ }
+
+ /* Now we have bit in our bitset available */
+ g_hash_table_iter_init (&it, mods_enabled);
+
+ while (g_hash_table_iter_next (&it, &k, &v)) {
+ id = rspamd_logger_add_debug_module ((const gchar *)k);
+
+ setbit (log_modules->bitset, id);
+ }
+} \ No newline at end of file