blob: 32336478639efa82c08cc56ac1cc3757637f3bd2 [file] [log] [blame]
Igor Sysoevd90282d2004-09-28 08:34:51 +00001
2/*
Igor Sysoevff8da912004-09-29 16:00:49 +00003 * Copyright (C) Igor Sysoev
Maxim Konovalovf8d59e32012-01-18 15:07:43 +00004 * Copyright (C) Nginx, Inc.
Igor Sysoevd90282d2004-09-28 08:34:51 +00005 */
6
7
Igor Sysoev6de5c2c2002-08-06 16:39:45 +00008#ifndef _NGX_LOG_H_INCLUDED_
9#define _NGX_LOG_H_INCLUDED_
10
11
Igor Sysoev1c104622003-06-03 15:42:58 +000012#include <ngx_config.h>
13#include <ngx_core.h>
14
Igor Sysoev6de5c2c2002-08-06 16:39:45 +000015
Igor Sysoevfff32322004-04-08 15:58:25 +000016#define NGX_LOG_STDERR 0
17#define NGX_LOG_EMERG 1
18#define NGX_LOG_ALERT 2
19#define NGX_LOG_CRIT 3
20#define NGX_LOG_ERR 4
21#define NGX_LOG_WARN 5
22#define NGX_LOG_NOTICE 6
23#define NGX_LOG_INFO 7
24#define NGX_LOG_DEBUG 8
Igor Sysoev865c1502003-11-30 20:03:18 +000025
Igor Sysoev81a432a2004-07-06 16:12:16 +000026#define NGX_LOG_DEBUG_CORE 0x010
27#define NGX_LOG_DEBUG_ALLOC 0x020
28#define NGX_LOG_DEBUG_MUTEX 0x040
29#define NGX_LOG_DEBUG_EVENT 0x080
30#define NGX_LOG_DEBUG_HTTP 0x100
Igor Sysoev02c8d182007-03-19 13:36:56 +000031#define NGX_LOG_DEBUG_MAIL 0x200
Igor Sysoevac72bd12006-05-04 15:32:46 +000032#define NGX_LOG_DEBUG_MYSQL 0x400
Igor Sysoev59cf56c2004-09-07 15:29:22 +000033
34/*
Igor Sysoevd90282d2004-09-28 08:34:51 +000035 * do not forget to update debug_levels[] in src/core/ngx_log.c
36 * after the adding a new debug level
Igor Sysoev59cf56c2004-09-07 15:29:22 +000037 */
Igor Sysoev5f800782003-12-08 20:48:12 +000038
Igor Sysoevfff32322004-04-08 15:58:25 +000039#define NGX_LOG_DEBUG_FIRST NGX_LOG_DEBUG_CORE
Igor Sysoev02c8d182007-03-19 13:36:56 +000040#define NGX_LOG_DEBUG_LAST NGX_LOG_DEBUG_MYSQL
Igor Sysoevfff32322004-04-08 15:58:25 +000041#define NGX_LOG_DEBUG_CONNECTION 0x80000000
42#define NGX_LOG_DEBUG_ALL 0x7ffffff0
Igor Sysoev6de5c2c2002-08-06 16:39:45 +000043
Igor Sysoev1c13c662003-05-20 15:37:55 +000044
Igor Sysoeve5a222c2005-01-25 12:27:35 +000045typedef u_char *(*ngx_log_handler_pt) (ngx_log_t *log, u_char *buf, size_t len);
Igor Sysoev10fc9ef2003-10-27 08:53:49 +000046
47
Igor Sysoev160d7742003-11-19 16:26:41 +000048struct ngx_log_s {
Igor Sysoev54498db2004-02-11 17:08:49 +000049 ngx_uint_t log_level;
Igor Sysoev10fc9ef2003-10-27 08:53:49 +000050 ngx_open_file_t *file;
Igor Sysoeve5a222c2005-01-25 12:27:35 +000051
Igor Sysoev4a715592005-02-24 12:29:09 +000052 ngx_atomic_uint_t connection;
Igor Sysoeve5a222c2005-01-25 12:27:35 +000053
Igor Sysoev10fc9ef2003-10-27 08:53:49 +000054 ngx_log_handler_pt handler;
Igor Sysoeve5a222c2005-01-25 12:27:35 +000055 void *data;
56
57 /*
58 * we declare "action" as "char *" because the actions are usually
59 * the static strings and in the "u_char *" case we have to override
60 * their types all the time
61 */
62
63 char *action;
Igor Sysoev160d7742003-11-19 16:26:41 +000064};
Igor Sysoev6de5c2c2002-08-06 16:39:45 +000065
Igor Sysoev1b735832004-11-11 14:07:14 +000066
67#define NGX_MAX_ERROR_STR 2048
Igor Sysoev6de5c2c2002-08-06 16:39:45 +000068
Igor Sysoev6de5c2c2002-08-06 16:39:45 +000069
Igor Sysoev865c1502003-11-30 20:03:18 +000070/*********************************/
71
Igor Sysoev802bc232010-07-05 13:02:25 +000072#if (NGX_HAVE_C99_VARIADIC_MACROS)
Igor Sysoev6de5c2c2002-08-06 16:39:45 +000073
Igor Sysoevc0edbcc2004-10-21 15:34:38 +000074#define NGX_HAVE_VARIADIC_MACROS 1
Igor Sysoev6de5c2c2002-08-06 16:39:45 +000075
Igor Sysoeve5a222c2005-01-25 12:27:35 +000076#define ngx_log_error(level, log, ...) \
Igor Sysoev31eb8c02005-09-23 11:02:22 +000077 if ((log)->log_level >= level) ngx_log_error_core(level, log, __VA_ARGS__)
Igor Sysoev6de5c2c2002-08-06 16:39:45 +000078
Igor Sysoeva5362982004-03-04 07:04:55 +000079void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,
Igor Sysoev8184d1b2005-03-04 14:06:57 +000080 const char *fmt, ...);
Igor Sysoev6de5c2c2002-08-06 16:39:45 +000081
Igor Sysoeve5a222c2005-01-25 12:27:35 +000082#define ngx_log_debug(level, log, ...) \
Igor Sysoev31eb8c02005-09-23 11:02:22 +000083 if ((log)->log_level & level) \
Igor Sysoeve5a222c2005-01-25 12:27:35 +000084 ngx_log_error_core(NGX_LOG_DEBUG, log, __VA_ARGS__)
85
Igor Sysoev865c1502003-11-30 20:03:18 +000086/*********************************/
Igor Sysoev1c13c662003-05-20 15:37:55 +000087
Igor Sysoev802bc232010-07-05 13:02:25 +000088#elif (NGX_HAVE_GCC_VARIADIC_MACROS)
89
90#define NGX_HAVE_VARIADIC_MACROS 1
91
92#define ngx_log_error(level, log, args...) \
93 if ((log)->log_level >= level) ngx_log_error_core(level, log, args)
94
95void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,
96 const char *fmt, ...);
97
98#define ngx_log_debug(level, log, args...) \
99 if ((log)->log_level & level) \
100 ngx_log_error_core(NGX_LOG_DEBUG, log, args)
101
102/*********************************/
103
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000104#else /* NO VARIADIC MACROS */
105
Igor Sysoevc0edbcc2004-10-21 15:34:38 +0000106#define NGX_HAVE_VARIADIC_MACROS 0
Igor Sysoev865c1502003-11-30 20:03:18 +0000107
Igor Sysoev4d656dc2005-03-22 16:02:46 +0000108void ngx_cdecl ngx_log_error(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,
Igor Sysoev8184d1b2005-03-04 14:06:57 +0000109 const char *fmt, ...);
Igor Sysoeva5362982004-03-04 07:04:55 +0000110void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,
Igor Sysoev8184d1b2005-03-04 14:06:57 +0000111 const char *fmt, va_list args);
Igor Sysoev4d656dc2005-03-22 16:02:46 +0000112void ngx_cdecl ngx_log_debug_core(ngx_log_t *log, ngx_err_t err,
113 const char *fmt, ...);
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000114
115
116#endif /* VARIADIC MACROS */
117
118
Igor Sysoev865c1502003-11-30 20:03:18 +0000119/*********************************/
120
Igor Sysoev5edf3872004-03-03 16:14:15 +0000121#if (NGX_DEBUG)
122
Igor Sysoevc0edbcc2004-10-21 15:34:38 +0000123#if (NGX_HAVE_VARIADIC_MACROS)
Igor Sysoev865c1502003-11-30 20:03:18 +0000124
Ruslan Ermilovd55ce182012-01-10 07:28:32 +0000125#define ngx_log_debug0(level, log, err, fmt) \
126 ngx_log_debug(level, log, err, fmt)
127
128#define ngx_log_debug1(level, log, err, fmt, arg1) \
129 ngx_log_debug(level, log, err, fmt, arg1)
130
131#define ngx_log_debug2(level, log, err, fmt, arg1, arg2) \
132 ngx_log_debug(level, log, err, fmt, arg1, arg2)
133
134#define ngx_log_debug3(level, log, err, fmt, arg1, arg2, arg3) \
135 ngx_log_debug(level, log, err, fmt, arg1, arg2, arg3)
136
137#define ngx_log_debug4(level, log, err, fmt, arg1, arg2, arg3, arg4) \
138 ngx_log_debug(level, log, err, fmt, arg1, arg2, arg3, arg4)
139
140#define ngx_log_debug5(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5) \
141 ngx_log_debug(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5)
142
143#define ngx_log_debug6(level, log, err, fmt, \
144 arg1, arg2, arg3, arg4, arg5, arg6) \
145 ngx_log_debug(level, log, err, fmt, \
146 arg1, arg2, arg3, arg4, arg5, arg6)
147
148#define ngx_log_debug7(level, log, err, fmt, \
149 arg1, arg2, arg3, arg4, arg5, arg6, arg7) \
150 ngx_log_debug(level, log, err, fmt, \
151 arg1, arg2, arg3, arg4, arg5, arg6, arg7)
152
153#define ngx_log_debug8(level, log, err, fmt, \
154 arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) \
155 ngx_log_debug(level, log, err, fmt, \
156 arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)
Igor Sysoeva14f89c2004-07-13 17:59:12 +0000157
Igor Sysoeve31e90b2005-05-19 13:25:22 +0000158
Igor Sysoev865c1502003-11-30 20:03:18 +0000159#else /* NO VARIADIC MACROS */
160
Igor Sysoeve5a222c2005-01-25 12:27:35 +0000161#define ngx_log_debug0(level, log, err, fmt) \
Igor Sysoev31eb8c02005-09-23 11:02:22 +0000162 if ((log)->log_level & level) \
Igor Sysoev865c1502003-11-30 20:03:18 +0000163 ngx_log_debug_core(log, err, fmt)
Igor Sysoev865c1502003-11-30 20:03:18 +0000164
Igor Sysoeve5a222c2005-01-25 12:27:35 +0000165#define ngx_log_debug1(level, log, err, fmt, arg1) \
Igor Sysoev31eb8c02005-09-23 11:02:22 +0000166 if ((log)->log_level & level) \
Igor Sysoev865c1502003-11-30 20:03:18 +0000167 ngx_log_debug_core(log, err, fmt, arg1)
Igor Sysoevdc867cd2003-12-14 20:10:27 +0000168
Igor Sysoeve5a222c2005-01-25 12:27:35 +0000169#define ngx_log_debug2(level, log, err, fmt, arg1, arg2) \
Igor Sysoev31eb8c02005-09-23 11:02:22 +0000170 if ((log)->log_level & level) \
Igor Sysoevdc867cd2003-12-14 20:10:27 +0000171 ngx_log_debug_core(log, err, fmt, arg1, arg2)
Igor Sysoevdc867cd2003-12-14 20:10:27 +0000172
Igor Sysoeve5a222c2005-01-25 12:27:35 +0000173#define ngx_log_debug3(level, log, err, fmt, arg1, arg2, arg3) \
Igor Sysoev31eb8c02005-09-23 11:02:22 +0000174 if ((log)->log_level & level) \
Igor Sysoev1cd1e272003-12-19 12:45:27 +0000175 ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3)
Igor Sysoev1cd1e272003-12-19 12:45:27 +0000176
Igor Sysoeve5a222c2005-01-25 12:27:35 +0000177#define ngx_log_debug4(level, log, err, fmt, arg1, arg2, arg3, arg4) \
Igor Sysoev31eb8c02005-09-23 11:02:22 +0000178 if ((log)->log_level & level) \
Igor Sysoev669e3312003-12-22 09:40:48 +0000179 ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3, arg4)
Igor Sysoev669e3312003-12-22 09:40:48 +0000180
Igor Sysoeve5a222c2005-01-25 12:27:35 +0000181#define ngx_log_debug5(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5) \
Igor Sysoev31eb8c02005-09-23 11:02:22 +0000182 if ((log)->log_level & level) \
Igor Sysoev669e3312003-12-22 09:40:48 +0000183 ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3, arg4, arg5)
Igor Sysoev669e3312003-12-22 09:40:48 +0000184
Igor Sysoeve5a222c2005-01-25 12:27:35 +0000185#define ngx_log_debug6(level, log, err, fmt, \
186 arg1, arg2, arg3, arg4, arg5, arg6) \
Igor Sysoev31eb8c02005-09-23 11:02:22 +0000187 if ((log)->log_level & level) \
Igor Sysoevdc867cd2003-12-14 20:10:27 +0000188 ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3, arg4, arg5, arg6)
Igor Sysoev5edf3872004-03-03 16:14:15 +0000189
Igor Sysoeve5a222c2005-01-25 12:27:35 +0000190#define ngx_log_debug7(level, log, err, fmt, \
191 arg1, arg2, arg3, arg4, arg5, arg6, arg7) \
Igor Sysoev31eb8c02005-09-23 11:02:22 +0000192 if ((log)->log_level & level) \
Igor Sysoeve5a222c2005-01-25 12:27:35 +0000193 ngx_log_debug_core(log, err, fmt, \
Igor Sysoeva14f89c2004-07-13 17:59:12 +0000194 arg1, arg2, arg3, arg4, arg5, arg6, arg7)
195
Igor Sysoeve5a222c2005-01-25 12:27:35 +0000196#define ngx_log_debug8(level, log, err, fmt, \
197 arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) \
Igor Sysoev31eb8c02005-09-23 11:02:22 +0000198 if ((log)->log_level & level) \
Igor Sysoeve5a222c2005-01-25 12:27:35 +0000199 ngx_log_debug_core(log, err, fmt, \
200 arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)
201
Igor Sysoev5edf3872004-03-03 16:14:15 +0000202#endif
203
204#else /* NO NGX_DEBUG */
205
206#define ngx_log_debug0(level, log, err, fmt)
207#define ngx_log_debug1(level, log, err, fmt, arg1)
208#define ngx_log_debug2(level, log, err, fmt, arg1, arg2)
209#define ngx_log_debug3(level, log, err, fmt, arg1, arg2, arg3)
210#define ngx_log_debug4(level, log, err, fmt, arg1, arg2, arg3, arg4)
211#define ngx_log_debug5(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5)
Igor Sysoevdc867cd2003-12-14 20:10:27 +0000212#define ngx_log_debug6(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5, arg6)
Igor Sysoevdc3b2a72004-09-14 19:39:54 +0000213#define ngx_log_debug7(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5, \
214 arg6, arg7)
Igor Sysoeve5a222c2005-01-25 12:27:35 +0000215#define ngx_log_debug8(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5, \
216 arg6, arg7, arg8)
Igor Sysoevdc867cd2003-12-14 20:10:27 +0000217
Igor Sysoev865c1502003-11-30 20:03:18 +0000218#endif
219
Igor Sysoev865c1502003-11-30 20:03:18 +0000220/*********************************/
221
Igor Sysoev5ef370d2009-04-27 11:32:33 +0000222ngx_log_t *ngx_log_init(u_char *prefix);
Igor Sysoev0cd76ea2009-04-30 13:53:42 +0000223ngx_log_t *ngx_log_create(ngx_cycle_t *cycle, ngx_str_t *name);
224char *ngx_log_set_levels(ngx_conf_t *cf, ngx_log_t *log);
Igor Sysoevc27497d2009-04-24 15:50:51 +0000225void ngx_cdecl ngx_log_abort(ngx_err_t err, const char *fmt, ...);
Igor Sysoevc28ff712009-04-23 11:13:12 +0000226void ngx_cdecl ngx_log_stderr(ngx_err_t err, const char *fmt, ...);
Igor Sysoevf67e0a42009-04-27 13:17:33 +0000227u_char *ngx_log_errno(u_char *buf, u_char *last, ngx_err_t err);
Igor Sysoev03420a62004-01-20 20:40:08 +0000228
Igor Sysoev96c56c92003-07-02 14:41:17 +0000229
Igor Sysoev07bb4ed2011-11-14 14:59:00 +0000230/*
231 * ngx_write_stderr() cannot be implemented as macro, since
232 * MSVC does not allow to use #ifdef inside macro parameters.
233 *
234 * ngx_write_fd() is used instead of ngx_write_console(), since
235 * CharToOemBuff() inside ngx_write_console() cannot be used with
236 * read only buffer as destination and CharToOemBuff() is not needed
237 * for ngx_write_stderr() anyway.
238 */
239static ngx_inline void
240ngx_write_stderr(char *text)
241{
242 (void) ngx_write_fd(ngx_stderr, text, strlen(text));
243}
244
245
Igor Sysoev1c104622003-06-03 15:42:58 +0000246extern ngx_module_t ngx_errlog_module;
Igor Sysoevc28ff712009-04-23 11:13:12 +0000247extern ngx_uint_t ngx_use_stderr;
Igor Sysoev1c104622003-06-03 15:42:58 +0000248
249
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000250#endif /* _NGX_LOG_H_INCLUDED_ */