10Sigor@sysoev.ru 20Sigor@sysoev.ru /* 30Sigor@sysoev.ru * Copyright (C) Igor Sysoev 40Sigor@sysoev.ru * Copyright (C) NGINX, Inc. 50Sigor@sysoev.ru */ 60Sigor@sysoev.ru 70Sigor@sysoev.ru #ifndef _NXT_LOG_H_INCLUDED_ 80Sigor@sysoev.ru #define _NXT_LOG_H_INCLUDED_ 90Sigor@sysoev.ru 100Sigor@sysoev.ru 11564Svbart@nginx.com #define NXT_LOG_ALERT 0 12564Svbart@nginx.com #define NXT_LOG_ERR 1 13564Svbart@nginx.com #define NXT_LOG_WARN 2 14564Svbart@nginx.com #define NXT_LOG_NOTICE 3 15564Svbart@nginx.com #define NXT_LOG_INFO 4 16564Svbart@nginx.com #define NXT_LOG_DEBUG 5 170Sigor@sysoev.ru 180Sigor@sysoev.ru 190Sigor@sysoev.ru #define NXT_MAX_ERROR_STR 2048 200Sigor@sysoev.ru 210Sigor@sysoev.ru 220Sigor@sysoev.ru typedef void nxt_cdecl (*nxt_log_handler_t)(nxt_uint_t level, nxt_log_t *log, 230Sigor@sysoev.ru const char *fmt, ...); 240Sigor@sysoev.ru typedef u_char *(*nxt_log_ctx_handler_t)(void *ctx, u_char *pos, u_char *end); 250Sigor@sysoev.ru 260Sigor@sysoev.ru 270Sigor@sysoev.ru struct nxt_log_s { 280Sigor@sysoev.ru uint32_t level; 290Sigor@sysoev.ru uint32_t ident; 300Sigor@sysoev.ru nxt_log_handler_t handler; 310Sigor@sysoev.ru nxt_log_ctx_handler_t ctx_handler; 320Sigor@sysoev.ru void *ctx; 330Sigor@sysoev.ru }; 340Sigor@sysoev.ru 350Sigor@sysoev.ru 360Sigor@sysoev.ru NXT_EXPORT void nxt_log_start(const char *name); 370Sigor@sysoev.ru NXT_EXPORT nxt_log_t *nxt_log_set_ctx(nxt_log_t *log, 380Sigor@sysoev.ru nxt_log_ctx_handler_t handler, void *ctx); 390Sigor@sysoev.ru 400Sigor@sysoev.ru NXT_EXPORT void nxt_cdecl nxt_log_handler(nxt_uint_t level, nxt_log_t *log, 410Sigor@sysoev.ru const char *fmt, ...); 420Sigor@sysoev.ru 430Sigor@sysoev.ru 440Sigor@sysoev.ru #define \ 450Sigor@sysoev.ru nxt_log_level_enough(log, level) \ 460Sigor@sysoev.ru ((log)->level >= (level)) 470Sigor@sysoev.ru 480Sigor@sysoev.ru 49564Svbart@nginx.com #define nxt_alert(task, ...) \ 500Sigor@sysoev.ru do { \ 51*1939Sz.hong@f5.com nxt_log_t *_log = (task)->log; \ 520Sigor@sysoev.ru \ 53*1939Sz.hong@f5.com _log->handler(NXT_LOG_ALERT, _log, __VA_ARGS__); \ 540Sigor@sysoev.ru } while (0) 550Sigor@sysoev.ru 560Sigor@sysoev.ru 571Sigor@sysoev.ru #define nxt_log(task, _level, ...) \ 581Sigor@sysoev.ru do { \ 59*1939Sz.hong@f5.com nxt_log_t *_log = (task)->log; \ 601Sigor@sysoev.ru nxt_uint_t _level_ = (_level); \ 611Sigor@sysoev.ru \ 62*1939Sz.hong@f5.com if (nxt_slow_path(_log->level >= _level_)) { \ 63*1939Sz.hong@f5.com _log->handler(_level_, _log, __VA_ARGS__); \ 641Sigor@sysoev.ru } \ 651Sigor@sysoev.ru } while (0) 661Sigor@sysoev.ru 671Sigor@sysoev.ru 681Sigor@sysoev.ru #define nxt_trace(task, ...) \ 691Sigor@sysoev.ru do { \ 70*1939Sz.hong@f5.com nxt_log_t *_log = (task)->log; \ 711Sigor@sysoev.ru \ 72*1939Sz.hong@f5.com if (nxt_slow_path(_log->level >= NXT_LOG_NOTICE || nxt_trace)) { \ 73*1939Sz.hong@f5.com _log->handler(NXT_LOG_NOTICE, _log, __VA_ARGS__); \ 741Sigor@sysoev.ru } \ 751Sigor@sysoev.ru } while (0) 761Sigor@sysoev.ru 771Sigor@sysoev.ru 78564Svbart@nginx.com #define nxt_log_alert(_log, ...) \ 79564Svbart@nginx.com do { \ 80564Svbart@nginx.com nxt_log_t *_log_ = (_log); \ 81564Svbart@nginx.com \ 82564Svbart@nginx.com _log_->handler(NXT_LOG_ALERT, _log_, __VA_ARGS__); \ 83564Svbart@nginx.com } while (0) 84564Svbart@nginx.com 85564Svbart@nginx.com 860Sigor@sysoev.ru #define \ 870Sigor@sysoev.ru nxt_log_error(_level, _log, ...) \ 880Sigor@sysoev.ru do { \ 890Sigor@sysoev.ru nxt_log_t *_log_ = (_log); \ 900Sigor@sysoev.ru nxt_uint_t _level_ = (_level); \ 910Sigor@sysoev.ru \ 920Sigor@sysoev.ru if (nxt_slow_path(_log_->level >= _level_)) { \ 930Sigor@sysoev.ru _log_->handler(_level_, _log_, __VA_ARGS__); \ 940Sigor@sysoev.ru } \ 950Sigor@sysoev.ru } while (0) 960Sigor@sysoev.ru 970Sigor@sysoev.ru 980Sigor@sysoev.ru #if (NXT_DEBUG) 990Sigor@sysoev.ru 1001Sigor@sysoev.ru #define nxt_debug(task, ...) \ 1011Sigor@sysoev.ru do { \ 102*1939Sz.hong@f5.com nxt_log_t *_log = (task)->log; \ 1031Sigor@sysoev.ru \ 104*1939Sz.hong@f5.com if (nxt_slow_path(_log->level == NXT_LOG_DEBUG || nxt_debug)) { \ 105*1939Sz.hong@f5.com _log->handler(NXT_LOG_DEBUG, _log, __VA_ARGS__); \ 1061Sigor@sysoev.ru } \ 1071Sigor@sysoev.ru } while (0) 1081Sigor@sysoev.ru 1091Sigor@sysoev.ru 1100Sigor@sysoev.ru #define \ 1110Sigor@sysoev.ru nxt_log_debug(_log, ...) \ 1120Sigor@sysoev.ru do { \ 1130Sigor@sysoev.ru nxt_log_t *_log_ = (_log); \ 1140Sigor@sysoev.ru \ 1150Sigor@sysoev.ru if (nxt_slow_path(_log_->level == NXT_LOG_DEBUG || nxt_debug)) { \ 1160Sigor@sysoev.ru _log_->handler(NXT_LOG_DEBUG, _log_, __VA_ARGS__); \ 1170Sigor@sysoev.ru } \ 1180Sigor@sysoev.ru } while (0) 1190Sigor@sysoev.ru 12063Sigor@sysoev.ru 121538Svbart@nginx.com #define nxt_assert(c) \ 122538Svbart@nginx.com do { \ 123538Svbart@nginx.com if (nxt_slow_path(!(c))) { \ 124538Svbart@nginx.com nxt_thread_log_alert("%s:%d assertion failed: %s", \ 125538Svbart@nginx.com __FILE__, __LINE__, #c); \ 126538Svbart@nginx.com nxt_abort(); \ 127538Svbart@nginx.com } \ 128538Svbart@nginx.com } while (0) 129538Svbart@nginx.com 130145Smax.romanov@nginx.com #else 131145Smax.romanov@nginx.com 132145Smax.romanov@nginx.com #define nxt_debug(...) 133145Smax.romanov@nginx.com 134145Smax.romanov@nginx.com #define \ 135145Smax.romanov@nginx.com nxt_log_debug(...) 136145Smax.romanov@nginx.com 137538Svbart@nginx.com #define nxt_assert(c) 138538Svbart@nginx.com 139145Smax.romanov@nginx.com #endif 140145Smax.romanov@nginx.com 141145Smax.romanov@nginx.com 142145Smax.romanov@nginx.com #if (NXT_DEBUG_ALLOC) 143145Smax.romanov@nginx.com 144145Smax.romanov@nginx.com #define nxt_debug_alloc(...) \ 145145Smax.romanov@nginx.com nxt_thread_log_debug(__VA_ARGS__) 14663Sigor@sysoev.ru 1470Sigor@sysoev.ru #else 1480Sigor@sysoev.ru 14963Sigor@sysoev.ru #define nxt_debug_alloc(...) 1501Sigor@sysoev.ru 1510Sigor@sysoev.ru #endif 1520Sigor@sysoev.ru 1530Sigor@sysoev.ru 1540Sigor@sysoev.ru #define \ 1550Sigor@sysoev.ru nxt_main_log_alert(...) \ 1560Sigor@sysoev.ru nxt_log_alert(&nxt_main_log, __VA_ARGS__) 1570Sigor@sysoev.ru 1580Sigor@sysoev.ru 1590Sigor@sysoev.ru #define \ 1600Sigor@sysoev.ru nxt_main_log_error(level, ...) \ 1610Sigor@sysoev.ru nxt_log_error(level, &nxt_main_log, __VA_ARGS__) 1620Sigor@sysoev.ru 1630Sigor@sysoev.ru 1640Sigor@sysoev.ru #define \ 1650Sigor@sysoev.ru nxt_main_log_debug(...) \ 1660Sigor@sysoev.ru nxt_log_debug(&nxt_main_log, __VA_ARGS__) 1670Sigor@sysoev.ru 1680Sigor@sysoev.ru 1690Sigor@sysoev.ru NXT_EXPORT extern nxt_uint_t nxt_debug; 1701Sigor@sysoev.ru NXT_EXPORT extern nxt_uint_t nxt_trace; 1710Sigor@sysoev.ru NXT_EXPORT extern nxt_log_t nxt_main_log; 1720Sigor@sysoev.ru NXT_EXPORT extern nxt_str_t nxt_log_levels[]; 1730Sigor@sysoev.ru 1740Sigor@sysoev.ru 1750Sigor@sysoev.ru #endif /* _NXT_LOG_H_INCLUDED_ */ 176