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