1 2 /* 3 * Copyright (C) Igor Sysoev 4 * Copyright (C) NGINX, Inc. 5 */ 6 7 #ifndef _NXT_LOG_H_INCLUDED_ 8 #define _NXT_LOG_H_INCLUDED_ 9 10 11 #define NXT_LOG_ALERT 0 12 #define NXT_LOG_ERR 1 13 #define NXT_LOG_WARN 2 14 #define NXT_LOG_NOTICE 3 15 #define NXT_LOG_INFO 4 16 #define NXT_LOG_DEBUG 5 17 18 19 #define NXT_MAX_ERROR_STR 2048 20 21 22 typedef void nxt_cdecl (*nxt_log_handler_t)(nxt_uint_t level, nxt_log_t *log, 23 const char *fmt, ...); 24 typedef u_char *(*nxt_log_ctx_handler_t)(void *ctx, u_char *pos, u_char *end); 25 26 27 struct nxt_log_s { 28 uint32_t level; 29 uint32_t ident; 30 nxt_log_handler_t handler; 31 nxt_log_ctx_handler_t ctx_handler; 32 void *ctx; 33 }; 34 35 36 NXT_EXPORT void nxt_log_start(const char *name); 37 NXT_EXPORT nxt_log_t *nxt_log_set_ctx(nxt_log_t *log, 38 nxt_log_ctx_handler_t handler, void *ctx); 39 40 NXT_EXPORT void nxt_cdecl nxt_log_handler(nxt_uint_t level, nxt_log_t *log, 41 const char *fmt, ...); 42 43 44 #define nxt_log_level_enough(log, level) \ 45 ((log)->level >= (level)) 46 47 48 #define nxt_alert(task, ...) \ 49 do { \ 50 nxt_log_t *_log = (task)->log; \ 51 \ 52 _log->handler(NXT_LOG_ALERT, _log, __VA_ARGS__); \ 53 } while (0) 54 55 56 #define nxt_log(task, _level, ...) \ 57 do { \ 58 nxt_log_t *_log = (task)->log; \ 59 nxt_uint_t _level_ = (_level); \ 60 \ 61 if (nxt_slow_path(_log->level >= _level_)) { \ 62 _log->handler(_level_, _log, __VA_ARGS__); \ 63 } \ 64 } while (0) 65 66 67 #define nxt_trace(task, ...) \ 68 do { \ 69 nxt_log_t *_log = (task)->log; \ 70 \ 71 if (nxt_slow_path(_log->level >= NXT_LOG_NOTICE || nxt_trace)) { \ 72 _log->handler(NXT_LOG_NOTICE, _log, __VA_ARGS__); \ 73 } \ 74 } while (0) 75 76 77 #define nxt_log_alert(_log, ...) \ 78 do { \ 79 nxt_log_t *_log_ = (_log); \ 80 \ 81 _log_->handler(NXT_LOG_ALERT, _log_, __VA_ARGS__); \ 82 } while (0) 83 84 85 #define nxt_log_error(_level, _log, ...) \ 86 do { \ 87 nxt_log_t *_log_ = (_log); \ 88 nxt_uint_t _level_ = (_level); \ 89 \ 90 if (nxt_slow_path(_log_->level >= _level_)) { \ 91 _log_->handler(_level_, _log_, __VA_ARGS__); \ 92 } \ 93 } while (0) 94 95 96 #if (NXT_DEBUG) 97 98 #define nxt_debug(task, ...) \ 99 do { \ 100 nxt_log_t *_log = (task)->log; \ 101 \ 102 if (nxt_slow_path(_log->level == NXT_LOG_DEBUG || nxt_debug)) { \ 103 _log->handler(NXT_LOG_DEBUG, _log, __VA_ARGS__); \ 104 } \ 105 } while (0) 106 107 108 #define nxt_log_debug(_log, ...) \ 109 do { \ 110 nxt_log_t *_log_ = (_log); \ 111 \ 112 if (nxt_slow_path(_log_->level == NXT_LOG_DEBUG || nxt_debug)) { \ 113 _log_->handler(NXT_LOG_DEBUG, _log_, __VA_ARGS__); \ 114 } \ 115 } while (0) 116 117 118 #define nxt_assert(c) \ 119 do { \ 120 if (nxt_slow_path(!(c))) { \ 121 nxt_thread_log_alert("%s:%d assertion failed: %s", \ 122 __FILE__, __LINE__, #c); \ 123 nxt_abort(); \ 124 } \ 125 } while (0) 126 127 #else 128 129 #define nxt_debug(...) 130 131 #define nxt_log_debug(...) 132 133 #define nxt_assert(c) 134 135 #endif 136 137 138 #if (NXT_DEBUG_ALLOC) 139 140 #define nxt_debug_alloc(...) \ 141 nxt_thread_log_debug(__VA_ARGS__) 142 143 #else 144 145 #define nxt_debug_alloc(...) 146 147 #endif 148 149 150 #define nxt_main_log_alert(...) \ 151 nxt_log_alert(&nxt_main_log, __VA_ARGS__) 152 153 154 #define nxt_main_log_error(level, ...) \ 155 nxt_log_error(level, &nxt_main_log, __VA_ARGS__) 156 157 158 #define nxt_main_log_debug(...) \ 159 nxt_log_debug(&nxt_main_log, __VA_ARGS__) 160 161 162 NXT_EXPORT extern nxt_uint_t nxt_debug; 163 NXT_EXPORT extern nxt_uint_t nxt_trace; 164 NXT_EXPORT extern nxt_log_t nxt_main_log; 165 NXT_EXPORT extern nxt_str_t nxt_log_levels[]; 166 167 168 #endif /* _NXT_LOG_H_INCLUDED_ */ 169