Igor Sysoev | d90282d | 2004-09-28 08:34:51 +0000 | [diff] [blame] | 1 | |
| 2 | /* |
Igor Sysoev | ff8da91 | 2004-09-29 16:00:49 +0000 | [diff] [blame] | 3 | * Copyright (C) Igor Sysoev |
Maxim Konovalov | f8d59e3 | 2012-01-18 15:07:43 +0000 | [diff] [blame] | 4 | * Copyright (C) Nginx, Inc. |
Igor Sysoev | d90282d | 2004-09-28 08:34:51 +0000 | [diff] [blame] | 5 | */ |
| 6 | |
| 7 | |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 8 | #ifndef _NGX_LOG_H_INCLUDED_ |
| 9 | #define _NGX_LOG_H_INCLUDED_ |
| 10 | |
| 11 | |
Igor Sysoev | 1c10462 | 2003-06-03 15:42:58 +0000 | [diff] [blame] | 12 | #include <ngx_config.h> |
| 13 | #include <ngx_core.h> |
| 14 | |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 15 | |
Igor Sysoev | fff3232 | 2004-04-08 15:58:25 +0000 | [diff] [blame] | 16 | #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 Sysoev | 865c150 | 2003-11-30 20:03:18 +0000 | [diff] [blame] | 25 | |
Igor Sysoev | 81a432a | 2004-07-06 16:12:16 +0000 | [diff] [blame] | 26 | #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 Sysoev | 02c8d18 | 2007-03-19 13:36:56 +0000 | [diff] [blame] | 31 | #define NGX_LOG_DEBUG_MAIL 0x200 |
Igor Sysoev | ac72bd1 | 2006-05-04 15:32:46 +0000 | [diff] [blame] | 32 | #define NGX_LOG_DEBUG_MYSQL 0x400 |
Igor Sysoev | 59cf56c | 2004-09-07 15:29:22 +0000 | [diff] [blame] | 33 | |
| 34 | /* |
Igor Sysoev | d90282d | 2004-09-28 08:34:51 +0000 | [diff] [blame] | 35 | * do not forget to update debug_levels[] in src/core/ngx_log.c |
| 36 | * after the adding a new debug level |
Igor Sysoev | 59cf56c | 2004-09-07 15:29:22 +0000 | [diff] [blame] | 37 | */ |
Igor Sysoev | 5f80078 | 2003-12-08 20:48:12 +0000 | [diff] [blame] | 38 | |
Igor Sysoev | fff3232 | 2004-04-08 15:58:25 +0000 | [diff] [blame] | 39 | #define NGX_LOG_DEBUG_FIRST NGX_LOG_DEBUG_CORE |
Igor Sysoev | 02c8d18 | 2007-03-19 13:36:56 +0000 | [diff] [blame] | 40 | #define NGX_LOG_DEBUG_LAST NGX_LOG_DEBUG_MYSQL |
Igor Sysoev | fff3232 | 2004-04-08 15:58:25 +0000 | [diff] [blame] | 41 | #define NGX_LOG_DEBUG_CONNECTION 0x80000000 |
| 42 | #define NGX_LOG_DEBUG_ALL 0x7ffffff0 |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 43 | |
Igor Sysoev | 1c13c66 | 2003-05-20 15:37:55 +0000 | [diff] [blame] | 44 | |
Igor Sysoev | e5a222c | 2005-01-25 12:27:35 +0000 | [diff] [blame] | 45 | typedef u_char *(*ngx_log_handler_pt) (ngx_log_t *log, u_char *buf, size_t len); |
Igor Sysoev | 10fc9ef | 2003-10-27 08:53:49 +0000 | [diff] [blame] | 46 | |
| 47 | |
Igor Sysoev | 160d774 | 2003-11-19 16:26:41 +0000 | [diff] [blame] | 48 | struct ngx_log_s { |
Igor Sysoev | 54498db | 2004-02-11 17:08:49 +0000 | [diff] [blame] | 49 | ngx_uint_t log_level; |
Igor Sysoev | 10fc9ef | 2003-10-27 08:53:49 +0000 | [diff] [blame] | 50 | ngx_open_file_t *file; |
Igor Sysoev | e5a222c | 2005-01-25 12:27:35 +0000 | [diff] [blame] | 51 | |
Igor Sysoev | 4a71559 | 2005-02-24 12:29:09 +0000 | [diff] [blame] | 52 | ngx_atomic_uint_t connection; |
Igor Sysoev | e5a222c | 2005-01-25 12:27:35 +0000 | [diff] [blame] | 53 | |
Igor Sysoev | 10fc9ef | 2003-10-27 08:53:49 +0000 | [diff] [blame] | 54 | ngx_log_handler_pt handler; |
Igor Sysoev | e5a222c | 2005-01-25 12:27:35 +0000 | [diff] [blame] | 55 | 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 Sysoev | 160d774 | 2003-11-19 16:26:41 +0000 | [diff] [blame] | 64 | }; |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 65 | |
Igor Sysoev | 1b73583 | 2004-11-11 14:07:14 +0000 | [diff] [blame] | 66 | |
| 67 | #define NGX_MAX_ERROR_STR 2048 |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 68 | |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 69 | |
Igor Sysoev | 865c150 | 2003-11-30 20:03:18 +0000 | [diff] [blame] | 70 | /*********************************/ |
| 71 | |
Igor Sysoev | 802bc23 | 2010-07-05 13:02:25 +0000 | [diff] [blame] | 72 | #if (NGX_HAVE_C99_VARIADIC_MACROS) |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 73 | |
Igor Sysoev | c0edbcc | 2004-10-21 15:34:38 +0000 | [diff] [blame] | 74 | #define NGX_HAVE_VARIADIC_MACROS 1 |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 75 | |
Igor Sysoev | e5a222c | 2005-01-25 12:27:35 +0000 | [diff] [blame] | 76 | #define ngx_log_error(level, log, ...) \ |
Igor Sysoev | 31eb8c0 | 2005-09-23 11:02:22 +0000 | [diff] [blame] | 77 | if ((log)->log_level >= level) ngx_log_error_core(level, log, __VA_ARGS__) |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 78 | |
Igor Sysoev | a536298 | 2004-03-04 07:04:55 +0000 | [diff] [blame] | 79 | void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err, |
Igor Sysoev | 8184d1b | 2005-03-04 14:06:57 +0000 | [diff] [blame] | 80 | const char *fmt, ...); |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 81 | |
Igor Sysoev | e5a222c | 2005-01-25 12:27:35 +0000 | [diff] [blame] | 82 | #define ngx_log_debug(level, log, ...) \ |
Igor Sysoev | 31eb8c0 | 2005-09-23 11:02:22 +0000 | [diff] [blame] | 83 | if ((log)->log_level & level) \ |
Igor Sysoev | e5a222c | 2005-01-25 12:27:35 +0000 | [diff] [blame] | 84 | ngx_log_error_core(NGX_LOG_DEBUG, log, __VA_ARGS__) |
| 85 | |
Igor Sysoev | 865c150 | 2003-11-30 20:03:18 +0000 | [diff] [blame] | 86 | /*********************************/ |
Igor Sysoev | 1c13c66 | 2003-05-20 15:37:55 +0000 | [diff] [blame] | 87 | |
Igor Sysoev | 802bc23 | 2010-07-05 13:02:25 +0000 | [diff] [blame] | 88 | #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 | |
| 95 | void 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 Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 104 | #else /* NO VARIADIC MACROS */ |
| 105 | |
Igor Sysoev | c0edbcc | 2004-10-21 15:34:38 +0000 | [diff] [blame] | 106 | #define NGX_HAVE_VARIADIC_MACROS 0 |
Igor Sysoev | 865c150 | 2003-11-30 20:03:18 +0000 | [diff] [blame] | 107 | |
Igor Sysoev | 4d656dc | 2005-03-22 16:02:46 +0000 | [diff] [blame] | 108 | void ngx_cdecl ngx_log_error(ngx_uint_t level, ngx_log_t *log, ngx_err_t err, |
Igor Sysoev | 8184d1b | 2005-03-04 14:06:57 +0000 | [diff] [blame] | 109 | const char *fmt, ...); |
Igor Sysoev | a536298 | 2004-03-04 07:04:55 +0000 | [diff] [blame] | 110 | void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err, |
Igor Sysoev | 8184d1b | 2005-03-04 14:06:57 +0000 | [diff] [blame] | 111 | const char *fmt, va_list args); |
Igor Sysoev | 4d656dc | 2005-03-22 16:02:46 +0000 | [diff] [blame] | 112 | void ngx_cdecl ngx_log_debug_core(ngx_log_t *log, ngx_err_t err, |
| 113 | const char *fmt, ...); |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 114 | |
| 115 | |
| 116 | #endif /* VARIADIC MACROS */ |
| 117 | |
| 118 | |
Igor Sysoev | 865c150 | 2003-11-30 20:03:18 +0000 | [diff] [blame] | 119 | /*********************************/ |
| 120 | |
Igor Sysoev | 5edf387 | 2004-03-03 16:14:15 +0000 | [diff] [blame] | 121 | #if (NGX_DEBUG) |
| 122 | |
Igor Sysoev | c0edbcc | 2004-10-21 15:34:38 +0000 | [diff] [blame] | 123 | #if (NGX_HAVE_VARIADIC_MACROS) |
Igor Sysoev | 865c150 | 2003-11-30 20:03:18 +0000 | [diff] [blame] | 124 | |
Ruslan Ermilov | d55ce18 | 2012-01-10 07:28:32 +0000 | [diff] [blame] | 125 | #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 Sysoev | a14f89c | 2004-07-13 17:59:12 +0000 | [diff] [blame] | 157 | |
Igor Sysoev | e31e90b | 2005-05-19 13:25:22 +0000 | [diff] [blame] | 158 | |
Igor Sysoev | 865c150 | 2003-11-30 20:03:18 +0000 | [diff] [blame] | 159 | #else /* NO VARIADIC MACROS */ |
| 160 | |
Igor Sysoev | e5a222c | 2005-01-25 12:27:35 +0000 | [diff] [blame] | 161 | #define ngx_log_debug0(level, log, err, fmt) \ |
Igor Sysoev | 31eb8c0 | 2005-09-23 11:02:22 +0000 | [diff] [blame] | 162 | if ((log)->log_level & level) \ |
Igor Sysoev | 865c150 | 2003-11-30 20:03:18 +0000 | [diff] [blame] | 163 | ngx_log_debug_core(log, err, fmt) |
Igor Sysoev | 865c150 | 2003-11-30 20:03:18 +0000 | [diff] [blame] | 164 | |
Igor Sysoev | e5a222c | 2005-01-25 12:27:35 +0000 | [diff] [blame] | 165 | #define ngx_log_debug1(level, log, err, fmt, arg1) \ |
Igor Sysoev | 31eb8c0 | 2005-09-23 11:02:22 +0000 | [diff] [blame] | 166 | if ((log)->log_level & level) \ |
Igor Sysoev | 865c150 | 2003-11-30 20:03:18 +0000 | [diff] [blame] | 167 | ngx_log_debug_core(log, err, fmt, arg1) |
Igor Sysoev | dc867cd | 2003-12-14 20:10:27 +0000 | [diff] [blame] | 168 | |
Igor Sysoev | e5a222c | 2005-01-25 12:27:35 +0000 | [diff] [blame] | 169 | #define ngx_log_debug2(level, log, err, fmt, arg1, arg2) \ |
Igor Sysoev | 31eb8c0 | 2005-09-23 11:02:22 +0000 | [diff] [blame] | 170 | if ((log)->log_level & level) \ |
Igor Sysoev | dc867cd | 2003-12-14 20:10:27 +0000 | [diff] [blame] | 171 | ngx_log_debug_core(log, err, fmt, arg1, arg2) |
Igor Sysoev | dc867cd | 2003-12-14 20:10:27 +0000 | [diff] [blame] | 172 | |
Igor Sysoev | e5a222c | 2005-01-25 12:27:35 +0000 | [diff] [blame] | 173 | #define ngx_log_debug3(level, log, err, fmt, arg1, arg2, arg3) \ |
Igor Sysoev | 31eb8c0 | 2005-09-23 11:02:22 +0000 | [diff] [blame] | 174 | if ((log)->log_level & level) \ |
Igor Sysoev | 1cd1e27 | 2003-12-19 12:45:27 +0000 | [diff] [blame] | 175 | ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3) |
Igor Sysoev | 1cd1e27 | 2003-12-19 12:45:27 +0000 | [diff] [blame] | 176 | |
Igor Sysoev | e5a222c | 2005-01-25 12:27:35 +0000 | [diff] [blame] | 177 | #define ngx_log_debug4(level, log, err, fmt, arg1, arg2, arg3, arg4) \ |
Igor Sysoev | 31eb8c0 | 2005-09-23 11:02:22 +0000 | [diff] [blame] | 178 | if ((log)->log_level & level) \ |
Igor Sysoev | 669e331 | 2003-12-22 09:40:48 +0000 | [diff] [blame] | 179 | ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3, arg4) |
Igor Sysoev | 669e331 | 2003-12-22 09:40:48 +0000 | [diff] [blame] | 180 | |
Igor Sysoev | e5a222c | 2005-01-25 12:27:35 +0000 | [diff] [blame] | 181 | #define ngx_log_debug5(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5) \ |
Igor Sysoev | 31eb8c0 | 2005-09-23 11:02:22 +0000 | [diff] [blame] | 182 | if ((log)->log_level & level) \ |
Igor Sysoev | 669e331 | 2003-12-22 09:40:48 +0000 | [diff] [blame] | 183 | ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3, arg4, arg5) |
Igor Sysoev | 669e331 | 2003-12-22 09:40:48 +0000 | [diff] [blame] | 184 | |
Igor Sysoev | e5a222c | 2005-01-25 12:27:35 +0000 | [diff] [blame] | 185 | #define ngx_log_debug6(level, log, err, fmt, \ |
| 186 | arg1, arg2, arg3, arg4, arg5, arg6) \ |
Igor Sysoev | 31eb8c0 | 2005-09-23 11:02:22 +0000 | [diff] [blame] | 187 | if ((log)->log_level & level) \ |
Igor Sysoev | dc867cd | 2003-12-14 20:10:27 +0000 | [diff] [blame] | 188 | ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3, arg4, arg5, arg6) |
Igor Sysoev | 5edf387 | 2004-03-03 16:14:15 +0000 | [diff] [blame] | 189 | |
Igor Sysoev | e5a222c | 2005-01-25 12:27:35 +0000 | [diff] [blame] | 190 | #define ngx_log_debug7(level, log, err, fmt, \ |
| 191 | arg1, arg2, arg3, arg4, arg5, arg6, arg7) \ |
Igor Sysoev | 31eb8c0 | 2005-09-23 11:02:22 +0000 | [diff] [blame] | 192 | if ((log)->log_level & level) \ |
Igor Sysoev | e5a222c | 2005-01-25 12:27:35 +0000 | [diff] [blame] | 193 | ngx_log_debug_core(log, err, fmt, \ |
Igor Sysoev | a14f89c | 2004-07-13 17:59:12 +0000 | [diff] [blame] | 194 | arg1, arg2, arg3, arg4, arg5, arg6, arg7) |
| 195 | |
Igor Sysoev | e5a222c | 2005-01-25 12:27:35 +0000 | [diff] [blame] | 196 | #define ngx_log_debug8(level, log, err, fmt, \ |
| 197 | arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) \ |
Igor Sysoev | 31eb8c0 | 2005-09-23 11:02:22 +0000 | [diff] [blame] | 198 | if ((log)->log_level & level) \ |
Igor Sysoev | e5a222c | 2005-01-25 12:27:35 +0000 | [diff] [blame] | 199 | ngx_log_debug_core(log, err, fmt, \ |
| 200 | arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) |
| 201 | |
Igor Sysoev | 5edf387 | 2004-03-03 16:14:15 +0000 | [diff] [blame] | 202 | #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 Sysoev | dc867cd | 2003-12-14 20:10:27 +0000 | [diff] [blame] | 212 | #define ngx_log_debug6(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5, arg6) |
Igor Sysoev | dc3b2a7 | 2004-09-14 19:39:54 +0000 | [diff] [blame] | 213 | #define ngx_log_debug7(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5, \ |
| 214 | arg6, arg7) |
Igor Sysoev | e5a222c | 2005-01-25 12:27:35 +0000 | [diff] [blame] | 215 | #define ngx_log_debug8(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5, \ |
| 216 | arg6, arg7, arg8) |
Igor Sysoev | dc867cd | 2003-12-14 20:10:27 +0000 | [diff] [blame] | 217 | |
Igor Sysoev | 865c150 | 2003-11-30 20:03:18 +0000 | [diff] [blame] | 218 | #endif |
| 219 | |
Igor Sysoev | 865c150 | 2003-11-30 20:03:18 +0000 | [diff] [blame] | 220 | /*********************************/ |
| 221 | |
Igor Sysoev | 5ef370d | 2009-04-27 11:32:33 +0000 | [diff] [blame] | 222 | ngx_log_t *ngx_log_init(u_char *prefix); |
Igor Sysoev | 0cd76ea | 2009-04-30 13:53:42 +0000 | [diff] [blame] | 223 | ngx_log_t *ngx_log_create(ngx_cycle_t *cycle, ngx_str_t *name); |
| 224 | char *ngx_log_set_levels(ngx_conf_t *cf, ngx_log_t *log); |
Igor Sysoev | c27497d | 2009-04-24 15:50:51 +0000 | [diff] [blame] | 225 | void ngx_cdecl ngx_log_abort(ngx_err_t err, const char *fmt, ...); |
Igor Sysoev | c28ff71 | 2009-04-23 11:13:12 +0000 | [diff] [blame] | 226 | void ngx_cdecl ngx_log_stderr(ngx_err_t err, const char *fmt, ...); |
Igor Sysoev | f67e0a4 | 2009-04-27 13:17:33 +0000 | [diff] [blame] | 227 | u_char *ngx_log_errno(u_char *buf, u_char *last, ngx_err_t err); |
Igor Sysoev | 03420a6 | 2004-01-20 20:40:08 +0000 | [diff] [blame] | 228 | |
Igor Sysoev | 96c56c9 | 2003-07-02 14:41:17 +0000 | [diff] [blame] | 229 | |
Igor Sysoev | 07bb4ed | 2011-11-14 14:59:00 +0000 | [diff] [blame] | 230 | /* |
| 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 | */ |
| 239 | static ngx_inline void |
| 240 | ngx_write_stderr(char *text) |
| 241 | { |
| 242 | (void) ngx_write_fd(ngx_stderr, text, strlen(text)); |
| 243 | } |
| 244 | |
| 245 | |
Igor Sysoev | 1c10462 | 2003-06-03 15:42:58 +0000 | [diff] [blame] | 246 | extern ngx_module_t ngx_errlog_module; |
Igor Sysoev | c28ff71 | 2009-04-23 11:13:12 +0000 | [diff] [blame] | 247 | extern ngx_uint_t ngx_use_stderr; |
Igor Sysoev | 1c10462 | 2003-06-03 15:42:58 +0000 | [diff] [blame] | 248 | |
| 249 | |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 250 | #endif /* _NGX_LOG_H_INCLUDED_ */ |