diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2018-01-20 12:39:37 +0000 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2018-01-20 12:39:37 +0000 |
commit | ef80118079258610197e5a1432e1a14610fb6006 (patch) | |
tree | cb38a616b48ab78ece45a1ec8cda49c190ce6839 /src | |
parent | cf58caf06a1813eff48363b559ad18fb01ddaa90 (diff) | |
download | rspamd-ef80118079258610197e5a1432e1a14610fb6006.tar.gz rspamd-ef80118079258610197e5a1432e1a14610fb6006.zip |
[Project] Add fast debug logging infrastructure
Diffstat (limited to 'src')
-rw-r--r-- | src/libutil/logger.c | 80 | ||||
-rw-r--r-- | src/libutil/logger.h | 22 |
2 files changed, 100 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 diff --git a/src/libutil/logger.h b/src/libutil/logger.h index ea7611cd6..9c9ca209a 100644 --- a/src/libutil/logger.h +++ b/src/libutil/logger.h @@ -96,12 +96,34 @@ void rspamd_common_logv (rspamd_logger_t *logger, gint level_flags, const gchar *fmt, va_list args); /** + * Add new logging module, returns module ID + * @param mod + * @return + */ +guint rspamd_logger_add_debug_module (const gchar *mod); + +/* + * Macro to use for faster debug modules + */ +#define INIT_LOG_MODULE(mname) \ + static guint mname##_log_id = (guint)-1; \ + static RSPAMD_CONSTRUCTOR(mname##_log_init) { \ + mname##_log_id = rspamd_logger_add_debug_module(#mname); \ +} + +void rspamd_logger_configure_modules (GHashTable *mods_enabled); + +/** * Conditional debug function */ void rspamd_conditional_debug (rspamd_logger_t *logger, rspamd_inet_addr_t *addr, const gchar *module, const gchar *id, const gchar *function, const gchar *fmt, ...); +void rspamd_conditional_debug_fast (rspamd_logger_t *logger, + rspamd_inet_addr_t *addr, guint mod_id, const gchar *id, + const gchar *function, const gchar *fmt, ...); + /** * Function with variable number of arguments support that uses static default logger */ |