xref: /unit/src/nxt_log.h (revision 2084:7d479274f334)
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