1e18a033bSKonstantin Ananyev
2e18a033bSKonstantin Ananyev/*
3e18a033bSKonstantin Ananyev * Copyright (C) Igor Sysoev
4e18a033bSKonstantin Ananyev * Copyright (C) Nginx, Inc.
5e18a033bSKonstantin Ananyev */
6e18a033bSKonstantin Ananyev
7e18a033bSKonstantin Ananyev
8e18a033bSKonstantin Ananyev#ifndef _NGX_LOG_H_INCLUDED_
9e18a033bSKonstantin Ananyev#define _NGX_LOG_H_INCLUDED_
10e18a033bSKonstantin Ananyev
11e18a033bSKonstantin Ananyev
12e18a033bSKonstantin Ananyev#include <ngx_config.h>
13e18a033bSKonstantin Ananyev#include <ngx_core.h>
14e18a033bSKonstantin Ananyev
15e18a033bSKonstantin Ananyev
16e18a033bSKonstantin Ananyev#define NGX_LOG_STDERR            0
17e18a033bSKonstantin Ananyev#define NGX_LOG_EMERG             1
18e18a033bSKonstantin Ananyev#define NGX_LOG_ALERT             2
19e18a033bSKonstantin Ananyev#define NGX_LOG_CRIT              3
20e18a033bSKonstantin Ananyev#define NGX_LOG_ERR               4
21e18a033bSKonstantin Ananyev#define NGX_LOG_WARN              5
22e18a033bSKonstantin Ananyev#define NGX_LOG_NOTICE            6
23e18a033bSKonstantin Ananyev#define NGX_LOG_INFO              7
24e18a033bSKonstantin Ananyev#define NGX_LOG_DEBUG             8
25e18a033bSKonstantin Ananyev
26e18a033bSKonstantin Ananyev#define NGX_LOG_DEBUG_CORE        0x010
27e18a033bSKonstantin Ananyev#define NGX_LOG_DEBUG_ALLOC       0x020
28e18a033bSKonstantin Ananyev#define NGX_LOG_DEBUG_MUTEX       0x040
29e18a033bSKonstantin Ananyev#define NGX_LOG_DEBUG_EVENT       0x080
30e18a033bSKonstantin Ananyev#define NGX_LOG_DEBUG_HTTP        0x100
31e18a033bSKonstantin Ananyev#define NGX_LOG_DEBUG_MAIL        0x200
32e18a033bSKonstantin Ananyev#define NGX_LOG_DEBUG_STREAM      0x400
33e18a033bSKonstantin Ananyev
34e18a033bSKonstantin Ananyev/*
35e18a033bSKonstantin Ananyev * do not forget to update debug_levels[] in src/core/ngx_log.c
36e18a033bSKonstantin Ananyev * after the adding a new debug level
37e18a033bSKonstantin Ananyev */
38e18a033bSKonstantin Ananyev
39e18a033bSKonstantin Ananyev#define NGX_LOG_DEBUG_FIRST       NGX_LOG_DEBUG_CORE
40e18a033bSKonstantin Ananyev#define NGX_LOG_DEBUG_LAST        NGX_LOG_DEBUG_STREAM
41e18a033bSKonstantin Ananyev#define NGX_LOG_DEBUG_CONNECTION  0x80000000
42e18a033bSKonstantin Ananyev#define NGX_LOG_DEBUG_ALL         0x7ffffff0
43e18a033bSKonstantin Ananyev
44e18a033bSKonstantin Ananyev
45e18a033bSKonstantin Ananyevtypedef u_char *(*ngx_log_handler_pt) (ngx_log_t *log, u_char *buf, size_t len);
46e18a033bSKonstantin Ananyevtypedef void (*ngx_log_writer_pt) (ngx_log_t *log, ngx_uint_t level,
47e18a033bSKonstantin Ananyev    u_char *buf, size_t len);
48e18a033bSKonstantin Ananyev
49e18a033bSKonstantin Ananyev
50e18a033bSKonstantin Ananyevstruct ngx_log_s {
51e18a033bSKonstantin Ananyev    ngx_uint_t           log_level;
52e18a033bSKonstantin Ananyev    ngx_open_file_t     *file;
53e18a033bSKonstantin Ananyev
54e18a033bSKonstantin Ananyev    ngx_atomic_uint_t    connection;
55e18a033bSKonstantin Ananyev
56e18a033bSKonstantin Ananyev    time_t               disk_full_time;
57e18a033bSKonstantin Ananyev
58e18a033bSKonstantin Ananyev    ngx_log_handler_pt   handler;
59e18a033bSKonstantin Ananyev    void                *data;
60e18a033bSKonstantin Ananyev
61e18a033bSKonstantin Ananyev    ngx_log_writer_pt    writer;
62e18a033bSKonstantin Ananyev    void                *wdata;
63e18a033bSKonstantin Ananyev
64e18a033bSKonstantin Ananyev    /*
65e18a033bSKonstantin Ananyev     * we declare "action" as "char *" because the actions are usually
66e18a033bSKonstantin Ananyev     * the static strings and in the "u_char *" case we have to override
67e18a033bSKonstantin Ananyev     * their types all the time
68e18a033bSKonstantin Ananyev     */
69e18a033bSKonstantin Ananyev
70e18a033bSKonstantin Ananyev    char                *action;
71e18a033bSKonstantin Ananyev
72e18a033bSKonstantin Ananyev    ngx_log_t           *next;
73e18a033bSKonstantin Ananyev};
74e18a033bSKonstantin Ananyev
75e18a033bSKonstantin Ananyev
76e18a033bSKonstantin Ananyev#define NGX_MAX_ERROR_STR   2048
77e18a033bSKonstantin Ananyev
78e18a033bSKonstantin Ananyev
79e18a033bSKonstantin Ananyev/*********************************/
80e18a033bSKonstantin Ananyev
81e18a033bSKonstantin Ananyev#if (NGX_HAVE_C99_VARIADIC_MACROS)
82e18a033bSKonstantin Ananyev
83e18a033bSKonstantin Ananyev#define NGX_HAVE_VARIADIC_MACROS  1
84e18a033bSKonstantin Ananyev
85e18a033bSKonstantin Ananyev#define ngx_log_error(level, log, ...)                                        \
86e18a033bSKonstantin Ananyev    if ((log)->log_level >= level) ngx_log_error_core(level, log, __VA_ARGS__)
87e18a033bSKonstantin Ananyev
88e18a033bSKonstantin Ananyevvoid ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,
89e18a033bSKonstantin Ananyev    const char *fmt, ...);
90e18a033bSKonstantin Ananyev
91e18a033bSKonstantin Ananyev#define ngx_log_debug(level, log, ...)                                        \
92e18a033bSKonstantin Ananyev    if ((log)->log_level & level)                                             \
93e18a033bSKonstantin Ananyev        ngx_log_error_core(NGX_LOG_DEBUG, log, __VA_ARGS__)
94e18a033bSKonstantin Ananyev
95e18a033bSKonstantin Ananyev/*********************************/
96e18a033bSKonstantin Ananyev
97e18a033bSKonstantin Ananyev#elif (NGX_HAVE_GCC_VARIADIC_MACROS)
98e18a033bSKonstantin Ananyev
99e18a033bSKonstantin Ananyev#define NGX_HAVE_VARIADIC_MACROS  1
100e18a033bSKonstantin Ananyev
101e18a033bSKonstantin Ananyev#define ngx_log_error(level, log, args...)                                    \
102e18a033bSKonstantin Ananyev    if ((log)->log_level >= level) ngx_log_error_core(level, log, args)
103e18a033bSKonstantin Ananyev
104e18a033bSKonstantin Ananyevvoid ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,
105e18a033bSKonstantin Ananyev    const char *fmt, ...);
106e18a033bSKonstantin Ananyev
107e18a033bSKonstantin Ananyev#define ngx_log_debug(level, log, args...)                                    \
108e18a033bSKonstantin Ananyev    if ((log)->log_level & level)                                             \
109e18a033bSKonstantin Ananyev        ngx_log_error_core(NGX_LOG_DEBUG, log, args)
110e18a033bSKonstantin Ananyev
111e18a033bSKonstantin Ananyev/*********************************/
112e18a033bSKonstantin Ananyev
113e18a033bSKonstantin Ananyev#else /* no variadic macros */
114e18a033bSKonstantin Ananyev
115e18a033bSKonstantin Ananyev#define NGX_HAVE_VARIADIC_MACROS  0
116e18a033bSKonstantin Ananyev
117e18a033bSKonstantin Ananyevvoid ngx_cdecl ngx_log_error(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,
118e18a033bSKonstantin Ananyev    const char *fmt, ...);
119e18a033bSKonstantin Ananyevvoid ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,
120e18a033bSKonstantin Ananyev    const char *fmt, va_list args);
121e18a033bSKonstantin Ananyevvoid ngx_cdecl ngx_log_debug_core(ngx_log_t *log, ngx_err_t err,
122e18a033bSKonstantin Ananyev    const char *fmt, ...);
123e18a033bSKonstantin Ananyev
124e18a033bSKonstantin Ananyev
125e18a033bSKonstantin Ananyev#endif /* variadic macros */
126e18a033bSKonstantin Ananyev
127e18a033bSKonstantin Ananyev
128e18a033bSKonstantin Ananyev/*********************************/
129e18a033bSKonstantin Ananyev
130e18a033bSKonstantin Ananyev#if (NGX_DEBUG)
131e18a033bSKonstantin Ananyev
132e18a033bSKonstantin Ananyev#if (NGX_HAVE_VARIADIC_MACROS)
133e18a033bSKonstantin Ananyev
134e18a033bSKonstantin Ananyev#define ngx_log_debug0(level, log, err, fmt)                                  \
135e18a033bSKonstantin Ananyev        ngx_log_debug(level, log, err, fmt)
136e18a033bSKonstantin Ananyev
137e18a033bSKonstantin Ananyev#define ngx_log_debug1(level, log, err, fmt, arg1)                            \
138e18a033bSKonstantin Ananyev        ngx_log_debug(level, log, err, fmt, arg1)
139e18a033bSKonstantin Ananyev
140e18a033bSKonstantin Ananyev#define ngx_log_debug2(level, log, err, fmt, arg1, arg2)                      \
141e18a033bSKonstantin Ananyev        ngx_log_debug(level, log, err, fmt, arg1, arg2)
142e18a033bSKonstantin Ananyev
143e18a033bSKonstantin Ananyev#define ngx_log_debug3(level, log, err, fmt, arg1, arg2, arg3)                \
144e18a033bSKonstantin Ananyev        ngx_log_debug(level, log, err, fmt, arg1, arg2, arg3)
145e18a033bSKonstantin Ananyev
146e18a033bSKonstantin Ananyev#define ngx_log_debug4(level, log, err, fmt, arg1, arg2, arg3, arg4)          \
147e18a033bSKonstantin Ananyev        ngx_log_debug(level, log, err, fmt, arg1, arg2, arg3, arg4)
148e18a033bSKonstantin Ananyev
149e18a033bSKonstantin Ananyev#define ngx_log_debug5(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5)    \
150e18a033bSKonstantin Ananyev        ngx_log_debug(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5)
151e18a033bSKonstantin Ananyev
152e18a033bSKonstantin Ananyev#define ngx_log_debug6(level, log, err, fmt,                                  \
153e18a033bSKonstantin Ananyev                       arg1, arg2, arg3, arg4, arg5, arg6)                    \
154e18a033bSKonstantin Ananyev        ngx_log_debug(level, log, err, fmt,                                   \
155e18a033bSKonstantin Ananyev                       arg1, arg2, arg3, arg4, arg5, arg6)
156e18a033bSKonstantin Ananyev
157e18a033bSKonstantin Ananyev#define ngx_log_debug7(level, log, err, fmt,                                  \
158e18a033bSKonstantin Ananyev                       arg1, arg2, arg3, arg4, arg5, arg6, arg7)              \
159e18a033bSKonstantin Ananyev        ngx_log_debug(level, log, err, fmt,                                   \
160e18a033bSKonstantin Ananyev                       arg1, arg2, arg3, arg4, arg5, arg6, arg7)
161e18a033bSKonstantin Ananyev
162e18a033bSKonstantin Ananyev#define ngx_log_debug8(level, log, err, fmt,                                  \
163e18a033bSKonstantin Ananyev                       arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)        \
164e18a033bSKonstantin Ananyev        ngx_log_debug(level, log, err, fmt,                                   \
165e18a033bSKonstantin Ananyev                       arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)
166e18a033bSKonstantin Ananyev
167e18a033bSKonstantin Ananyev
168e18a033bSKonstantin Ananyev#else /* no variadic macros */
169e18a033bSKonstantin Ananyev
170e18a033bSKonstantin Ananyev#define ngx_log_debug0(level, log, err, fmt)                                  \
171e18a033bSKonstantin Ananyev    if ((log)->log_level & level)                                             \
172e18a033bSKonstantin Ananyev        ngx_log_debug_core(log, err, fmt)
173e18a033bSKonstantin Ananyev
174e18a033bSKonstantin Ananyev#define ngx_log_debug1(level, log, err, fmt, arg1)                            \
175e18a033bSKonstantin Ananyev    if ((log)->log_level & level)                                             \
176e18a033bSKonstantin Ananyev        ngx_log_debug_core(log, err, fmt, arg1)
177e18a033bSKonstantin Ananyev
178e18a033bSKonstantin Ananyev#define ngx_log_debug2(level, log, err, fmt, arg1, arg2)                      \
179e18a033bSKonstantin Ananyev    if ((log)->log_level & level)                                             \
180e18a033bSKonstantin Ananyev        ngx_log_debug_core(log, err, fmt, arg1, arg2)
181e18a033bSKonstantin Ananyev
182e18a033bSKonstantin Ananyev#define ngx_log_debug3(level, log, err, fmt, arg1, arg2, arg3)                \
183e18a033bSKonstantin Ananyev    if ((log)->log_level & level)                                             \
184e18a033bSKonstantin Ananyev        ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3)
185e18a033bSKonstantin Ananyev
186e18a033bSKonstantin Ananyev#define ngx_log_debug4(level, log, err, fmt, arg1, arg2, arg3, arg4)          \
187e18a033bSKonstantin Ananyev    if ((log)->log_level & level)                                             \
188e18a033bSKonstantin Ananyev        ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3, arg4)
189e18a033bSKonstantin Ananyev
190e18a033bSKonstantin Ananyev#define ngx_log_debug5(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5)    \
191e18a033bSKonstantin Ananyev    if ((log)->log_level & level)                                             \
192e18a033bSKonstantin Ananyev        ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3, arg4, arg5)
193e18a033bSKonstantin Ananyev
194e18a033bSKonstantin Ananyev#define ngx_log_debug6(level, log, err, fmt,                                  \
195e18a033bSKonstantin Ananyev                       arg1, arg2, arg3, arg4, arg5, arg6)                    \
196e18a033bSKonstantin Ananyev    if ((log)->log_level & level)                                             \
197e18a033bSKonstantin Ananyev        ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3, arg4, arg5, arg6)
198e18a033bSKonstantin Ananyev
199e18a033bSKonstantin Ananyev#define ngx_log_debug7(level, log, err, fmt,                                  \
200e18a033bSKonstantin Ananyev                       arg1, arg2, arg3, arg4, arg5, arg6, arg7)              \
201e18a033bSKonstantin Ananyev    if ((log)->log_level & level)                                             \
202e18a033bSKonstantin Ananyev        ngx_log_debug_core(log, err, fmt,                                     \
203e18a033bSKonstantin Ananyev                       arg1, arg2, arg3, arg4, arg5, arg6, arg7)
204e18a033bSKonstantin Ananyev
205e18a033bSKonstantin Ananyev#define ngx_log_debug8(level, log, err, fmt,                                  \
206e18a033bSKonstantin Ananyev                       arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)        \
207e18a033bSKonstantin Ananyev    if ((log)->log_level & level)                                             \
208e18a033bSKonstantin Ananyev        ngx_log_debug_core(log, err, fmt,                                     \
209e18a033bSKonstantin Ananyev                       arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)
210e18a033bSKonstantin Ananyev
211e18a033bSKonstantin Ananyev#endif
212e18a033bSKonstantin Ananyev
213e18a033bSKonstantin Ananyev#else /* !NGX_DEBUG */
214e18a033bSKonstantin Ananyev
215e18a033bSKonstantin Ananyev#define ngx_log_debug0(level, log, err, fmt)
216e18a033bSKonstantin Ananyev#define ngx_log_debug1(level, log, err, fmt, arg1)
217e18a033bSKonstantin Ananyev#define ngx_log_debug2(level, log, err, fmt, arg1, arg2)
218e18a033bSKonstantin Ananyev#define ngx_log_debug3(level, log, err, fmt, arg1, arg2, arg3)
219e18a033bSKonstantin Ananyev#define ngx_log_debug4(level, log, err, fmt, arg1, arg2, arg3, arg4)
220e18a033bSKonstantin Ananyev#define ngx_log_debug5(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5)
221e18a033bSKonstantin Ananyev#define ngx_log_debug6(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5, arg6)
222e18a033bSKonstantin Ananyev#define ngx_log_debug7(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5,    \
223e18a033bSKonstantin Ananyev                       arg6, arg7)
224e18a033bSKonstantin Ananyev#define ngx_log_debug8(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5,    \
225e18a033bSKonstantin Ananyev                       arg6, arg7, arg8)
226e18a033bSKonstantin Ananyev
227e18a033bSKonstantin Ananyev#endif
228e18a033bSKonstantin Ananyev
229e18a033bSKonstantin Ananyev/*********************************/
230e18a033bSKonstantin Ananyev
231e18a033bSKonstantin Ananyevngx_log_t *ngx_log_init(u_char *prefix);
232e18a033bSKonstantin Ananyevvoid ngx_cdecl ngx_log_abort(ngx_err_t err, const char *fmt, ...);
233e18a033bSKonstantin Ananyevvoid ngx_cdecl ngx_log_stderr(ngx_err_t err, const char *fmt, ...);
234e18a033bSKonstantin Ananyevu_char *ngx_log_errno(u_char *buf, u_char *last, ngx_err_t err);
235e18a033bSKonstantin Ananyevngx_int_t ngx_log_open_default(ngx_cycle_t *cycle);
236e18a033bSKonstantin Ananyevngx_int_t ngx_log_redirect_stderr(ngx_cycle_t *cycle);
237e18a033bSKonstantin Ananyevngx_log_t *ngx_log_get_file_log(ngx_log_t *head);
238e18a033bSKonstantin Ananyevchar *ngx_log_set_log(ngx_conf_t *cf, ngx_log_t **head);
239e18a033bSKonstantin Ananyev
240e18a033bSKonstantin Ananyev
241e18a033bSKonstantin Ananyev/*
242e18a033bSKonstantin Ananyev * ngx_write_stderr() cannot be implemented as macro, since
243e18a033bSKonstantin Ananyev * MSVC does not allow to use #ifdef inside macro parameters.
244e18a033bSKonstantin Ananyev *
245e18a033bSKonstantin Ananyev * ngx_write_fd() is used instead of ngx_write_console(), since
246e18a033bSKonstantin Ananyev * CharToOemBuff() inside ngx_write_console() cannot be used with
247e18a033bSKonstantin Ananyev * read only buffer as destination and CharToOemBuff() is not needed
248e18a033bSKonstantin Ananyev * for ngx_write_stderr() anyway.
249e18a033bSKonstantin Ananyev */
250e18a033bSKonstantin Ananyevstatic ngx_inline void
251e18a033bSKonstantin Ananyevngx_write_stderr(char *text)
252e18a033bSKonstantin Ananyev{
253e18a033bSKonstantin Ananyev    (void) ngx_write_fd(ngx_stderr, text, ngx_strlen(text));
254e18a033bSKonstantin Ananyev}
255e18a033bSKonstantin Ananyev
256e18a033bSKonstantin Ananyev
257e18a033bSKonstantin Ananyevstatic ngx_inline void
258e18a033bSKonstantin Ananyevngx_write_stdout(char *text)
259e18a033bSKonstantin Ananyev{
260e18a033bSKonstantin Ananyev    (void) ngx_write_fd(ngx_stdout, text, ngx_strlen(text));
261e18a033bSKonstantin Ananyev}
262e18a033bSKonstantin Ananyev
263e18a033bSKonstantin Ananyev
264e18a033bSKonstantin Ananyevextern ngx_module_t  ngx_errlog_module;
265e18a033bSKonstantin Ananyevextern ngx_uint_t    ngx_use_stderr;
266e18a033bSKonstantin Ananyev
267e18a033bSKonstantin Ananyev
268e18a033bSKonstantin Ananyev#endif /* _NGX_LOG_H_INCLUDED_ */
269