You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

logger.h 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. #ifndef RSPAMD_LOGGER_H
  2. #define RSPAMD_LOGGER_H
  3. #include "config.h"
  4. #include "cfg_file.h"
  5. #include "radix.h"
  6. #include "util.h"
  7. #ifndef G_LOG_LEVEL_USER_SHIFT
  8. #define G_LOG_LEVEL_USER_SHIFT 8
  9. #endif
  10. enum rspamd_log_flags {
  11. RSPAMD_LOG_FORCED = (1 << G_LOG_LEVEL_USER_SHIFT),
  12. RSPAMD_LOG_ENCRYPTED = (1 << (G_LOG_LEVEL_USER_SHIFT + 1)),
  13. RSPAMD_LOG_LEVEL_MASK = ~(RSPAMD_LOG_FORCED|RSPAMD_LOG_ENCRYPTED)
  14. };
  15. typedef void (*rspamd_log_func_t) (const gchar *module, const gchar *id,
  16. const gchar *function,
  17. gint level_flags, const gchar *message, gpointer arg);
  18. typedef struct rspamd_logger_s rspamd_logger_t;
  19. #define RSPAMD_LOGBUF_SIZE 8192
  20. /**
  21. * Init logger
  22. */
  23. void rspamd_set_logger (struct rspamd_config *cfg,
  24. GQuark ptype,
  25. rspamd_logger_t **plogger,
  26. rspamd_mempool_t *pool);
  27. /**
  28. * Open log file or initialize other structures
  29. */
  30. gint rspamd_log_open (rspamd_logger_t *logger);
  31. /**
  32. * Close log file or destroy other structures
  33. */
  34. void rspamd_log_close (rspamd_logger_t *logger, gboolean termination);
  35. /**
  36. * Close and open log again
  37. */
  38. gint rspamd_log_reopen (rspamd_logger_t *logger);
  39. /**
  40. * Open log file or initialize other structures for privileged processes
  41. */
  42. gint rspamd_log_open_priv (rspamd_logger_t *logger, uid_t uid, gid_t gid);
  43. /**
  44. * Close log file or destroy other structures for privileged processes
  45. */
  46. void rspamd_log_close_priv (rspamd_logger_t *logger, gboolean termination, uid_t uid, gid_t gid);
  47. /**
  48. * Close and open log again for privileged processes
  49. */
  50. gint rspamd_log_reopen_priv (rspamd_logger_t *logger, uid_t uid, gid_t gid);
  51. /**
  52. * Set log pid
  53. */
  54. void rspamd_log_update_pid (GQuark ptype, rspamd_logger_t *logger);
  55. /**
  56. * Flush log buffer for some types of logging
  57. */
  58. void rspamd_log_flush (rspamd_logger_t *logger);
  59. /**
  60. * Log function that is compatible for glib messages
  61. */
  62. void rspamd_glib_log_function (const gchar *log_domain,
  63. GLogLevelFlags log_level, const gchar *message, gpointer arg);
  64. /**
  65. * Log function for printing glib assertions
  66. */
  67. void rspamd_glib_printerr_function (const gchar *message);
  68. /**
  69. * Function with variable number of arguments support
  70. */
  71. void rspamd_common_log_function (rspamd_logger_t *logger,
  72. gint level_flags,
  73. const gchar *module, const gchar *id,
  74. const gchar *function, const gchar *fmt, ...);
  75. void rspamd_common_logv (rspamd_logger_t *logger, gint level_flags,
  76. const gchar *module, const gchar *id, const gchar *function,
  77. const gchar *fmt, va_list args);
  78. /**
  79. * Add new logging module, returns module ID
  80. * @param mod
  81. * @return
  82. */
  83. guint rspamd_logger_add_debug_module (const gchar *mod);
  84. /*
  85. * Macro to use for faster debug modules
  86. */
  87. #define INIT_LOG_MODULE(mname) \
  88. static guint rspamd_##mname##_log_id = (guint)-1; \
  89. RSPAMD_CONSTRUCTOR(rspamd_##mname##_log_init) { \
  90. rspamd_##mname##_log_id = rspamd_logger_add_debug_module(#mname); \
  91. }
  92. #define INIT_LOG_MODULE_PUBLIC(mname) \
  93. guint rspamd_##mname##_log_id = (guint)-1; \
  94. RSPAMD_CONSTRUCTOR(rspamd_##mname##_log_init) { \
  95. rspamd_##mname##_log_id = rspamd_logger_add_debug_module(#mname); \
  96. }
  97. void rspamd_logger_configure_modules (GHashTable *mods_enabled);
  98. /**
  99. * Conditional debug function
  100. */
  101. void rspamd_conditional_debug (rspamd_logger_t *logger,
  102. rspamd_inet_addr_t *addr, const gchar *module, const gchar *id,
  103. const gchar *function, const gchar *fmt, ...);
  104. void rspamd_conditional_debug_fast (rspamd_logger_t *logger,
  105. rspamd_inet_addr_t *addr,
  106. guint mod_id, const gchar *module, const gchar *id,
  107. const gchar *function, const gchar *fmt, ...);
  108. /**
  109. * Function with variable number of arguments support that uses static default logger
  110. */
  111. void rspamd_default_log_function (gint level_flags,
  112. const gchar *module, const gchar *id,
  113. const gchar *function,
  114. const gchar *fmt,
  115. ...);
  116. /**
  117. * Varargs version of default log function
  118. * @param log_level
  119. * @param function
  120. * @param fmt
  121. * @param args
  122. */
  123. void rspamd_default_logv (gint level_flags,
  124. const gchar *module, const gchar *id,
  125. const gchar *function,
  126. const gchar *fmt,
  127. va_list args);
  128. /**
  129. * Temporary turn on debug
  130. */
  131. void rspamd_log_debug (rspamd_logger_t *logger);
  132. /**
  133. * Turn off debug
  134. */
  135. void rspamd_log_nodebug (rspamd_logger_t *logger);
  136. /**
  137. * Turn off locking on logger (useful to avoid races)
  138. */
  139. void rspamd_log_nolock (rspamd_logger_t *logger);
  140. /**
  141. * Turn on locking to avoid log output mix
  142. */
  143. void rspamd_log_lock (rspamd_logger_t *logger);
  144. /**
  145. * Return array of counters (4 numbers):
  146. * 0 - errors
  147. * 1 - warnings
  148. * 2 - info messages
  149. * 3 - debug messages
  150. */
  151. const guint64* rspamd_log_counters (rspamd_logger_t *logger);
  152. /**
  153. * Returns errors ring buffer as ucl array
  154. * @param logger
  155. * @return
  156. */
  157. ucl_object_t * rspamd_log_errorbuf_export (const rspamd_logger_t *logger);
  158. /**
  159. * Returns the current logger object
  160. * @return
  161. */
  162. rspamd_logger_t* rspamd_logger_get_singleton (void);
  163. /* Typical functions */
  164. extern guint rspamd_task_log_id;
  165. /* Logging in postfix style */
  166. #define msg_err(...) rspamd_default_log_function (G_LOG_LEVEL_CRITICAL, \
  167. NULL, NULL, \
  168. G_STRFUNC, \
  169. __VA_ARGS__)
  170. #define msg_warn(...) rspamd_default_log_function (G_LOG_LEVEL_WARNING, \
  171. NULL, NULL, \
  172. G_STRFUNC, \
  173. __VA_ARGS__)
  174. #define msg_info(...) rspamd_default_log_function (G_LOG_LEVEL_INFO, \
  175. NULL, NULL, \
  176. G_STRFUNC, \
  177. __VA_ARGS__)
  178. #define msg_notice(...) rspamd_default_log_function (G_LOG_LEVEL_MESSAGE, \
  179. NULL, NULL, \
  180. G_STRFUNC, \
  181. __VA_ARGS__)
  182. #define msg_debug(...) rspamd_default_log_function (G_LOG_LEVEL_DEBUG, \
  183. NULL, NULL, \
  184. G_STRFUNC, \
  185. __VA_ARGS__)
  186. #define debug_task(...) rspamd_conditional_debug_fast (NULL, \
  187. task->from_addr, \
  188. rspamd_task_log_id, "task", task->task_pool->tag.uid, \
  189. G_STRFUNC, \
  190. __VA_ARGS__)
  191. /* Use the following macros if you have `task` in the function */
  192. #define msg_err_task(...) rspamd_default_log_function (G_LOG_LEVEL_CRITICAL, \
  193. task->task_pool->tag.tagname, task->task_pool->tag.uid, \
  194. G_STRFUNC, \
  195. __VA_ARGS__)
  196. #define msg_warn_task(...) rspamd_default_log_function (G_LOG_LEVEL_WARNING, \
  197. task->task_pool->tag.tagname, task->task_pool->tag.uid, \
  198. G_STRFUNC, \
  199. __VA_ARGS__)
  200. #define msg_notice_task(...) rspamd_default_log_function (G_LOG_LEVEL_MESSAGE, \
  201. task->task_pool->tag.tagname, task->task_pool->tag.uid, \
  202. G_STRFUNC, \
  203. __VA_ARGS__)
  204. #define msg_info_task(...) rspamd_default_log_function (G_LOG_LEVEL_INFO, \
  205. task->task_pool->tag.tagname, task->task_pool->tag.uid, \
  206. G_STRFUNC, \
  207. __VA_ARGS__)
  208. #define msg_debug_task(...) rspamd_conditional_debug_fast (NULL, task->from_addr, \
  209. rspamd_task_log_id, "task", task->task_pool->tag.uid, \
  210. G_STRFUNC, \
  211. __VA_ARGS__)
  212. #define msg_err_task_encrypted(...) rspamd_default_log_function (G_LOG_LEVEL_CRITICAL|RSPAMD_LOG_ENCRYPTED, \
  213. task->task_pool->tag.tagname, task->task_pool->tag.uid, \
  214. G_STRFUNC, \
  215. __VA_ARGS__)
  216. #define msg_warn_task_encrypted(...) rspamd_default_log_function (G_LOG_LEVEL_WARNING|RSPAMD_LOG_ENCRYPTED, \
  217. task->task_pool->tag.tagname, task->task_pool->tag.uid, \
  218. G_STRFUNC, \
  219. __VA_ARGS__)
  220. #define msg_notice_task_encrypted(...) rspamd_default_log_function (G_LOG_LEVEL_MESSAGE|RSPAMD_LOG_ENCRYPTED, \
  221. task->task_pool->tag.tagname, task->task_pool->tag.uid, \
  222. G_STRFUNC, \
  223. __VA_ARGS__)
  224. #define msg_info_task_encrypted(...) rspamd_default_log_function (G_LOG_LEVEL_INFO|RSPAMD_LOG_ENCRYPTED, \
  225. task->task_pool->tag.tagname, task->task_pool->tag.uid, \
  226. G_STRFUNC, \
  227. __VA_ARGS__)
  228. /* Check for NULL pointer first */
  229. #define msg_err_task_check(...) rspamd_default_log_function (G_LOG_LEVEL_CRITICAL, \
  230. task ? task->task_pool->tag.tagname : NULL, task ? task->task_pool->tag.uid : NULL, \
  231. G_STRFUNC, \
  232. __VA_ARGS__)
  233. #define msg_warn_task_check(...) rspamd_default_log_function (G_LOG_LEVEL_WARNING, \
  234. task ? task->task_pool->tag.tagname : NULL, task ? task->task_pool->tag.uid : NULL, \
  235. G_STRFUNC, \
  236. __VA_ARGS__)
  237. #define msg_info_task_check(...) rspamd_default_log_function (G_LOG_LEVEL_MESSAGE, \
  238. task ? task->task_pool->tag.tagname : NULL, task ? task->task_pool->tag.uid : NULL, \
  239. G_STRFUNC, \
  240. __VA_ARGS__)
  241. #define msg_notice_task_check(...) rspamd_default_log_function (G_LOG_LEVEL_INFO, \
  242. task ? task->task_pool->tag.tagname : NULL, task ? task->task_pool->tag.uid : NULL, \
  243. G_STRFUNC, \
  244. __VA_ARGS__)
  245. #define msg_debug_task_check(...) rspamd_conditional_debug_fast (NULL, \
  246. task ? task->from_addr : NULL, \
  247. rspamd_task_log_id, "task", task ? task->task_pool->tag.uid : NULL, \
  248. G_STRFUNC, \
  249. __VA_ARGS__)
  250. /* Use the following macros if you have `pool` in the function */
  251. #define msg_err_pool(...) rspamd_default_log_function (G_LOG_LEVEL_CRITICAL, \
  252. pool->tag.tagname, pool->tag.uid, \
  253. G_STRFUNC, \
  254. __VA_ARGS__)
  255. #define msg_warn_pool(...) rspamd_default_log_function (G_LOG_LEVEL_WARNING, \
  256. pool->tag.tagname, pool->tag.uid, \
  257. G_STRFUNC, \
  258. __VA_ARGS__)
  259. #define msg_info_pool(...) rspamd_default_log_function (G_LOG_LEVEL_INFO, \
  260. pool->tag.tagname, pool->tag.uid, \
  261. G_STRFUNC, \
  262. __VA_ARGS__)
  263. #define msg_debug_pool(...) rspamd_conditional_debug (NULL, NULL, \
  264. pool->tag.tagname, pool->tag.uid, \
  265. G_STRFUNC, \
  266. __VA_ARGS__)
  267. /* Check for NULL pointer first */
  268. #define msg_err_pool_check(...) rspamd_default_log_function (G_LOG_LEVEL_CRITICAL, \
  269. pool ? pool->tag.tagname : NULL, pool ? pool->tag.uid : NULL, \
  270. G_STRFUNC, \
  271. __VA_ARGS__)
  272. #define msg_warn_pool_check(...) rspamd_default_log_function (G_LOG_LEVEL_WARNING, \
  273. pool ? pool->tag.tagname : NULL, pool ? pool->tag.uid : NULL, \
  274. G_STRFUNC, \
  275. __VA_ARGS__)
  276. #define msg_info_pool_check(...) rspamd_default_log_function (G_LOG_LEVEL_INFO, \
  277. pool ? pool->tag.tagname : NULL, pool ? pool->tag.uid : NULL, \
  278. G_STRFUNC, \
  279. __VA_ARGS__)
  280. #define msg_debug_pool_check(...) rspamd_conditional_debug (NULL, NULL, \
  281. pool ? pool->tag.tagname : NULL, pool ? pool->tag.uid : NULL, \
  282. G_STRFUNC, \
  283. __VA_ARGS__)
  284. #endif