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 9.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  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. void rspamd_logger_configure_modules (GHashTable *mods_enabled);
  93. /**
  94. * Conditional debug function
  95. */
  96. void rspamd_conditional_debug (rspamd_logger_t *logger,
  97. rspamd_inet_addr_t *addr, const gchar *module, const gchar *id,
  98. const gchar *function, const gchar *fmt, ...);
  99. void rspamd_conditional_debug_fast (rspamd_logger_t *logger,
  100. rspamd_inet_addr_t *addr,
  101. guint mod_id, const gchar *module, const gchar *id,
  102. const gchar *function, const gchar *fmt, ...);
  103. /**
  104. * Function with variable number of arguments support that uses static default logger
  105. */
  106. void rspamd_default_log_function (gint level_flags,
  107. const gchar *module, const gchar *id,
  108. const gchar *function,
  109. const gchar *fmt,
  110. ...);
  111. /**
  112. * Varargs version of default log function
  113. * @param log_level
  114. * @param function
  115. * @param fmt
  116. * @param args
  117. */
  118. void rspamd_default_logv (gint level_flags,
  119. const gchar *module, const gchar *id,
  120. const gchar *function,
  121. const gchar *fmt,
  122. va_list args);
  123. /**
  124. * Temporary turn on debug
  125. */
  126. void rspamd_log_debug (rspamd_logger_t *logger);
  127. /**
  128. * Turn off debug
  129. */
  130. void rspamd_log_nodebug (rspamd_logger_t *logger);
  131. /**
  132. * Turn off locking on logger (useful to avoid races)
  133. */
  134. void rspamd_log_nolock (rspamd_logger_t *logger);
  135. /**
  136. * Turn on locking to avoid log output mix
  137. */
  138. void rspamd_log_lock (rspamd_logger_t *logger);
  139. /**
  140. * Return array of counters (4 numbers):
  141. * 0 - errors
  142. * 1 - warnings
  143. * 2 - info messages
  144. * 3 - debug messages
  145. */
  146. const guint64* rspamd_log_counters (rspamd_logger_t *logger);
  147. /**
  148. * Returns errors ring buffer as ucl array
  149. * @param logger
  150. * @return
  151. */
  152. ucl_object_t * rspamd_log_errorbuf_export (const rspamd_logger_t *logger);
  153. /* Typical functions */
  154. extern guint rspamd_task_log_id;
  155. /* Logging in postfix style */
  156. #define msg_err(...) rspamd_default_log_function (G_LOG_LEVEL_CRITICAL, \
  157. NULL, NULL, \
  158. G_STRFUNC, \
  159. __VA_ARGS__)
  160. #define msg_warn(...) rspamd_default_log_function (G_LOG_LEVEL_WARNING, \
  161. NULL, NULL, \
  162. G_STRFUNC, \
  163. __VA_ARGS__)
  164. #define msg_info(...) rspamd_default_log_function (G_LOG_LEVEL_INFO, \
  165. NULL, NULL, \
  166. G_STRFUNC, \
  167. __VA_ARGS__)
  168. #define msg_notice(...) rspamd_default_log_function (G_LOG_LEVEL_MESSAGE, \
  169. NULL, NULL, \
  170. G_STRFUNC, \
  171. __VA_ARGS__)
  172. #define msg_debug(...) rspamd_default_log_function (G_LOG_LEVEL_DEBUG, \
  173. NULL, NULL, \
  174. G_STRFUNC, \
  175. __VA_ARGS__)
  176. #define debug_task(...) rspamd_conditional_debug_fast (NULL, \
  177. task->from_addr, \
  178. rspamd_task_log_id, "task", task->task_pool->tag.uid, \
  179. G_STRFUNC, \
  180. __VA_ARGS__)
  181. /* Use the following macros if you have `task` in the function */
  182. #define msg_err_task(...) rspamd_default_log_function (G_LOG_LEVEL_CRITICAL, \
  183. task->task_pool->tag.tagname, task->task_pool->tag.uid, \
  184. G_STRFUNC, \
  185. __VA_ARGS__)
  186. #define msg_warn_task(...) rspamd_default_log_function (G_LOG_LEVEL_WARNING, \
  187. task->task_pool->tag.tagname, task->task_pool->tag.uid, \
  188. G_STRFUNC, \
  189. __VA_ARGS__)
  190. #define msg_notice_task(...) rspamd_default_log_function (G_LOG_LEVEL_MESSAGE, \
  191. task->task_pool->tag.tagname, task->task_pool->tag.uid, \
  192. G_STRFUNC, \
  193. __VA_ARGS__)
  194. #define msg_info_task(...) rspamd_default_log_function (G_LOG_LEVEL_INFO, \
  195. task->task_pool->tag.tagname, task->task_pool->tag.uid, \
  196. G_STRFUNC, \
  197. __VA_ARGS__)
  198. #define msg_debug_task(...) rspamd_conditional_debug_fast (NULL, task->from_addr, \
  199. rspamd_task_log_id, "task", task->task_pool->tag.uid, \
  200. G_STRFUNC, \
  201. __VA_ARGS__)
  202. #define msg_err_task_encrypted(...) rspamd_default_log_function (G_LOG_LEVEL_CRITICAL|RSPAMD_LOG_ENCRYPTED, \
  203. task->task_pool->tag.tagname, task->task_pool->tag.uid, \
  204. G_STRFUNC, \
  205. __VA_ARGS__)
  206. #define msg_warn_task_encrypted(...) rspamd_default_log_function (G_LOG_LEVEL_WARNING|RSPAMD_LOG_ENCRYPTED, \
  207. task->task_pool->tag.tagname, task->task_pool->tag.uid, \
  208. G_STRFUNC, \
  209. __VA_ARGS__)
  210. #define msg_notice_task_encrypted(...) rspamd_default_log_function (G_LOG_LEVEL_MESSAGE|RSPAMD_LOG_ENCRYPTED, \
  211. task->task_pool->tag.tagname, task->task_pool->tag.uid, \
  212. G_STRFUNC, \
  213. __VA_ARGS__)
  214. #define msg_info_task_encrypted(...) rspamd_default_log_function (G_LOG_LEVEL_INFO|RSPAMD_LOG_ENCRYPTED, \
  215. task->task_pool->tag.tagname, task->task_pool->tag.uid, \
  216. G_STRFUNC, \
  217. __VA_ARGS__)
  218. /* Check for NULL pointer first */
  219. #define msg_err_task_check(...) rspamd_default_log_function (G_LOG_LEVEL_CRITICAL, \
  220. task ? task->task_pool->tag.tagname : NULL, task ? task->task_pool->tag.uid : NULL, \
  221. G_STRFUNC, \
  222. __VA_ARGS__)
  223. #define msg_warn_task_check(...) rspamd_default_log_function (G_LOG_LEVEL_WARNING, \
  224. task ? task->task_pool->tag.tagname : NULL, task ? task->task_pool->tag.uid : NULL, \
  225. G_STRFUNC, \
  226. __VA_ARGS__)
  227. #define msg_info_task_check(...) rspamd_default_log_function (G_LOG_LEVEL_MESSAGE, \
  228. task ? task->task_pool->tag.tagname : NULL, task ? task->task_pool->tag.uid : NULL, \
  229. G_STRFUNC, \
  230. __VA_ARGS__)
  231. #define msg_notice_task_check(...) rspamd_default_log_function (G_LOG_LEVEL_INFO, \
  232. task ? task->task_pool->tag.tagname : NULL, task ? task->task_pool->tag.uid : NULL, \
  233. G_STRFUNC, \
  234. __VA_ARGS__)
  235. #define msg_debug_task_check(...) rspamd_conditional_debug_fast (NULL, \
  236. task ? task->from_addr : NULL, \
  237. rspamd_task_log_id, "task", task ? task->task_pool->tag.uid : NULL, \
  238. G_STRFUNC, \
  239. __VA_ARGS__)
  240. /* Use the following macros if you have `pool` in the function */
  241. #define msg_err_pool(...) rspamd_default_log_function (G_LOG_LEVEL_CRITICAL, \
  242. pool->tag.tagname, pool->tag.uid, \
  243. G_STRFUNC, \
  244. __VA_ARGS__)
  245. #define msg_warn_pool(...) rspamd_default_log_function (G_LOG_LEVEL_WARNING, \
  246. pool->tag.tagname, pool->tag.uid, \
  247. G_STRFUNC, \
  248. __VA_ARGS__)
  249. #define msg_info_pool(...) rspamd_default_log_function (G_LOG_LEVEL_INFO, \
  250. pool->tag.tagname, pool->tag.uid, \
  251. G_STRFUNC, \
  252. __VA_ARGS__)
  253. #define msg_debug_pool(...) rspamd_conditional_debug (NULL, NULL, \
  254. pool->tag.tagname, pool->tag.uid, \
  255. G_STRFUNC, \
  256. __VA_ARGS__)
  257. /* Check for NULL pointer first */
  258. #define msg_err_pool_check(...) rspamd_default_log_function (G_LOG_LEVEL_CRITICAL, \
  259. pool ? pool->tag.tagname : NULL, pool ? pool->tag.uid : NULL, \
  260. G_STRFUNC, \
  261. __VA_ARGS__)
  262. #define msg_warn_pool_check(...) rspamd_default_log_function (G_LOG_LEVEL_WARNING, \
  263. pool ? pool->tag.tagname : NULL, pool ? pool->tag.uid : NULL, \
  264. G_STRFUNC, \
  265. __VA_ARGS__)
  266. #define msg_info_pool_check(...) rspamd_conditional_debug (NULL, NULL, \
  267. G_LOG_LEVEL_INFO, \
  268. pool ? pool->tag.tagname : NULL, pool ? pool->tag.uid : NULL, \
  269. G_STRFUNC, \
  270. __VA_ARGS__)
  271. #define msg_debug_pool_check(...) rspamd_conditional_debug (NULL, NULL, \
  272. pool ? pool->tag.tagname : NULL, pool ? pool->tag.uid : NULL, \
  273. G_STRFUNC, \
  274. __VA_ARGS__)
  275. #endif