Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 1 | |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 2 | #include <ngx_config.h> |
Igor Sysoev | 1c13c66 | 2003-05-20 15:37:55 +0000 | [diff] [blame] | 3 | #include <ngx_core.h> |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 4 | |
| 5 | |
Igor Sysoev | d8e1f07 | 2004-01-22 06:47:28 +0000 | [diff] [blame] | 6 | static void ngx_log_write(ngx_log_t *log, char *errstr, size_t len); |
Igor Sysoev | 1c10462 | 2003-06-03 15:42:58 +0000 | [diff] [blame] | 7 | static char *ngx_set_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); |
| 8 | |
| 9 | |
| 10 | static ngx_str_t errlog_name = ngx_string("errlog"); |
| 11 | |
| 12 | static ngx_command_t ngx_errlog_commands[] = { |
| 13 | |
| 14 | {ngx_string("error_log"), |
Igor Sysoev | 5f80078 | 2003-12-08 20:48:12 +0000 | [diff] [blame] | 15 | NGX_MAIN_CONF|NGX_CONF_1MORE, |
Igor Sysoev | 1c10462 | 2003-06-03 15:42:58 +0000 | [diff] [blame] | 16 | ngx_set_error_log, |
| 17 | 0, |
| 18 | 0, |
| 19 | NULL}, |
| 20 | |
| 21 | ngx_null_command |
| 22 | }; |
| 23 | |
| 24 | |
| 25 | ngx_module_t ngx_errlog_module = { |
| 26 | NGX_MODULE, |
| 27 | &errlog_name, /* module context */ |
| 28 | ngx_errlog_commands, /* module directives */ |
| 29 | NGX_CORE_MODULE, /* module type */ |
Igor Sysoev | a7f7fa8 | 2003-07-11 04:50:59 +0000 | [diff] [blame] | 30 | NULL, /* init module */ |
| 31 | NULL /* init child */ |
Igor Sysoev | 1c10462 | 2003-06-03 15:42:58 +0000 | [diff] [blame] | 32 | }; |
| 33 | |
| 34 | |
Igor Sysoev | f5e97c5 | 2003-06-26 15:35:36 +0000 | [diff] [blame] | 35 | static ngx_open_file_t ngx_stderr; |
| 36 | static ngx_log_t ngx_log; |
Igor Sysoev | 1c10462 | 2003-06-03 15:42:58 +0000 | [diff] [blame] | 37 | |
| 38 | |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 39 | static const char *err_levels[] = { |
Igor Sysoev | 1c13c66 | 2003-05-20 15:37:55 +0000 | [diff] [blame] | 40 | "stderr", "emerg", "alert", "crit", "error", |
| 41 | "warn", "notice", "info", "debug" |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 42 | }; |
| 43 | |
Igor Sysoev | 5f80078 | 2003-12-08 20:48:12 +0000 | [diff] [blame] | 44 | static const char *debug_levels[] = { |
Igor Sysoev | 3c3ca17 | 2004-01-05 20:55:48 +0000 | [diff] [blame] | 45 | "debug", "debug_core", "debug_alloc", "debug_event", "debug_http" |
Igor Sysoev | 5f80078 | 2003-12-08 20:48:12 +0000 | [diff] [blame] | 46 | }; |
| 47 | |
| 48 | |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 49 | #if (HAVE_VARIADIC_MACROS) |
| 50 | void ngx_log_error_core(int level, ngx_log_t *log, ngx_err_t err, |
| 51 | const char *fmt, ...) |
| 52 | #else |
| 53 | void ngx_log_error_core(int level, ngx_log_t *log, ngx_err_t err, |
| 54 | const char *fmt, va_list args) |
| 55 | #endif |
| 56 | { |
Igor Sysoev | 1c13c66 | 2003-05-20 15:37:55 +0000 | [diff] [blame] | 57 | char errstr[MAX_ERROR_STR]; |
Igor Sysoev | d8e1f07 | 2004-01-22 06:47:28 +0000 | [diff] [blame] | 58 | size_t len, max; |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 59 | #if (HAVE_VARIADIC_MACROS) |
Igor Sysoev | 1c13c66 | 2003-05-20 15:37:55 +0000 | [diff] [blame] | 60 | va_list args; |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 61 | #endif |
| 62 | |
Igor Sysoev | 890fc96 | 2003-07-20 21:15:59 +0000 | [diff] [blame] | 63 | if (log->file->fd == NGX_INVALID_FILE) { |
| 64 | return; |
| 65 | } |
| 66 | |
Igor Sysoev | 562e53e | 2003-11-13 06:14:05 +0000 | [diff] [blame] | 67 | ngx_memcpy(errstr, ngx_cached_err_log_time.data, |
| 68 | ngx_cached_err_log_time.len); |
| 69 | |
Igor Sysoev | d8e1f07 | 2004-01-22 06:47:28 +0000 | [diff] [blame] | 70 | #if (WIN32) |
| 71 | max = MAX_ERROR_STR - 2; |
| 72 | #else |
| 73 | max = MAX_ERROR_STR - 1; |
| 74 | #endif |
| 75 | |
Igor Sysoev | 562e53e | 2003-11-13 06:14:05 +0000 | [diff] [blame] | 76 | len = ngx_cached_err_log_time.len; |
| 77 | |
Igor Sysoev | d8e1f07 | 2004-01-22 06:47:28 +0000 | [diff] [blame] | 78 | len += ngx_snprintf(errstr + len, max - len, " [%s] ", err_levels[level]); |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 79 | |
Igor Sysoev | a6717c4 | 2002-12-23 06:29:22 +0000 | [diff] [blame] | 80 | /* pid#tid */ |
Igor Sysoev | d8e1f07 | 2004-01-22 06:47:28 +0000 | [diff] [blame] | 81 | len += ngx_snprintf(errstr + len, max - len, |
Igor Sysoev | a2aca9a | 2004-01-18 21:09:21 +0000 | [diff] [blame] | 82 | PID_T_FMT "#%d: ", ngx_getpid(), /* STUB */ 0); |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 83 | |
Igor Sysoev | 160d774 | 2003-11-19 16:26:41 +0000 | [diff] [blame] | 84 | if (log->data) { |
Igor Sysoev | d8e1f07 | 2004-01-22 06:47:28 +0000 | [diff] [blame] | 85 | len += ngx_snprintf(errstr + len, max - len, |
Igor Sysoev | 160d774 | 2003-11-19 16:26:41 +0000 | [diff] [blame] | 86 | "*%u ", * (u_int *) log->data); |
| 87 | } |
| 88 | |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 89 | #if (HAVE_VARIADIC_MACROS) |
Igor Sysoev | 160d774 | 2003-11-19 16:26:41 +0000 | [diff] [blame] | 90 | |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 91 | va_start(args, fmt); |
Igor Sysoev | d8e1f07 | 2004-01-22 06:47:28 +0000 | [diff] [blame] | 92 | len += ngx_vsnprintf(errstr + len, max - len, fmt, args); |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 93 | va_end(args); |
Igor Sysoev | 160d774 | 2003-11-19 16:26:41 +0000 | [diff] [blame] | 94 | |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 95 | #else |
Igor Sysoev | 160d774 | 2003-11-19 16:26:41 +0000 | [diff] [blame] | 96 | |
Igor Sysoev | d8e1f07 | 2004-01-22 06:47:28 +0000 | [diff] [blame] | 97 | len += ngx_vsnprintf(errstr + len, max - len, fmt, args); |
Igor Sysoev | 160d774 | 2003-11-19 16:26:41 +0000 | [diff] [blame] | 98 | |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 99 | #endif |
| 100 | |
Igor Sysoev | 0ad17c0 | 2002-08-26 15:18:19 +0000 | [diff] [blame] | 101 | if (err) { |
Igor Sysoev | 1d8d9ee | 2003-04-28 15:06:39 +0000 | [diff] [blame] | 102 | |
Igor Sysoev | d8e1f07 | 2004-01-22 06:47:28 +0000 | [diff] [blame] | 103 | if (len > max - 50) { |
Igor Sysoev | 2f2491b | 2004-01-21 16:38:54 +0000 | [diff] [blame] | 104 | /* leave a space for an error code */ |
Igor Sysoev | d8e1f07 | 2004-01-22 06:47:28 +0000 | [diff] [blame] | 105 | len = max - 50; |
Igor Sysoev | 2f2491b | 2004-01-21 16:38:54 +0000 | [diff] [blame] | 106 | errstr[len++] = '.'; |
| 107 | errstr[len++] = '.'; |
| 108 | errstr[len++] = '.'; |
| 109 | } |
| 110 | |
Igor Sysoev | a6717c4 | 2002-12-23 06:29:22 +0000 | [diff] [blame] | 111 | #if (WIN32) |
Igor Sysoev | 1d8d9ee | 2003-04-28 15:06:39 +0000 | [diff] [blame] | 112 | if ((unsigned) err >= 0x80000000) { |
Igor Sysoev | d8e1f07 | 2004-01-22 06:47:28 +0000 | [diff] [blame] | 113 | len += ngx_snprintf(errstr + len, max - len, " (%X: ", err); |
Igor Sysoev | 1d8d9ee | 2003-04-28 15:06:39 +0000 | [diff] [blame] | 114 | } else { |
Igor Sysoev | d8e1f07 | 2004-01-22 06:47:28 +0000 | [diff] [blame] | 115 | len += ngx_snprintf(errstr + len, max - len, " (%d: ", err); |
Igor Sysoev | 1d8d9ee | 2003-04-28 15:06:39 +0000 | [diff] [blame] | 116 | } |
| 117 | #else |
Igor Sysoev | d8e1f07 | 2004-01-22 06:47:28 +0000 | [diff] [blame] | 118 | len += ngx_snprintf(errstr + len, max - len, " (%d: ", err); |
Igor Sysoev | 1d8d9ee | 2003-04-28 15:06:39 +0000 | [diff] [blame] | 119 | #endif |
Igor Sysoev | 0ad17c0 | 2002-08-26 15:18:19 +0000 | [diff] [blame] | 120 | |
Igor Sysoev | d8e1f07 | 2004-01-22 06:47:28 +0000 | [diff] [blame] | 121 | if (len >= max) { |
| 122 | ngx_log_write(log, errstr, max); |
Igor Sysoev | 2f2491b | 2004-01-21 16:38:54 +0000 | [diff] [blame] | 123 | return; |
| 124 | } |
| 125 | |
Igor Sysoev | d8e1f07 | 2004-01-22 06:47:28 +0000 | [diff] [blame] | 126 | len += ngx_strerror_r(err, errstr + len, max - len); |
Igor Sysoev | 2f2491b | 2004-01-21 16:38:54 +0000 | [diff] [blame] | 127 | |
Igor Sysoev | d8e1f07 | 2004-01-22 06:47:28 +0000 | [diff] [blame] | 128 | if (len >= max) { |
| 129 | ngx_log_write(log, errstr, max); |
Igor Sysoev | 2f2491b | 2004-01-21 16:38:54 +0000 | [diff] [blame] | 130 | return; |
| 131 | } |
| 132 | |
| 133 | errstr[len++] = ')'; |
| 134 | |
Igor Sysoev | d8e1f07 | 2004-01-22 06:47:28 +0000 | [diff] [blame] | 135 | if (len >= max) { |
| 136 | ngx_log_write(log, errstr, max); |
Igor Sysoev | 2f2491b | 2004-01-21 16:38:54 +0000 | [diff] [blame] | 137 | return; |
| 138 | } |
| 139 | |
| 140 | } else { |
Igor Sysoev | d8e1f07 | 2004-01-22 06:47:28 +0000 | [diff] [blame] | 141 | if (len >= max) { |
| 142 | ngx_log_write(log, errstr, max); |
Igor Sysoev | 2f2491b | 2004-01-21 16:38:54 +0000 | [diff] [blame] | 143 | return; |
Igor Sysoev | 0ad17c0 | 2002-08-26 15:18:19 +0000 | [diff] [blame] | 144 | } |
| 145 | } |
| 146 | |
Igor Sysoev | a6717c4 | 2002-12-23 06:29:22 +0000 | [diff] [blame] | 147 | if (level != NGX_LOG_DEBUG && log->handler) { |
Igor Sysoev | d8e1f07 | 2004-01-22 06:47:28 +0000 | [diff] [blame] | 148 | len += log->handler(log->data, errstr + len, max - len); |
Igor Sysoev | 0ad17c0 | 2002-08-26 15:18:19 +0000 | [diff] [blame] | 149 | |
Igor Sysoev | d8e1f07 | 2004-01-22 06:47:28 +0000 | [diff] [blame] | 150 | if (len >= max) { |
| 151 | len = max; |
Igor Sysoev | 2f2491b | 2004-01-21 16:38:54 +0000 | [diff] [blame] | 152 | } |
Igor Sysoev | a6717c4 | 2002-12-23 06:29:22 +0000 | [diff] [blame] | 153 | } |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 154 | |
Igor Sysoev | d8e1f07 | 2004-01-22 06:47:28 +0000 | [diff] [blame] | 155 | ngx_log_write(log, errstr, len); |
| 156 | } |
| 157 | |
| 158 | |
| 159 | static void ngx_log_write(ngx_log_t *log, char *errstr, size_t len) |
| 160 | { |
Igor Sysoev | a6717c4 | 2002-12-23 06:29:22 +0000 | [diff] [blame] | 161 | #if (WIN32) |
Igor Sysoev | d8e1f07 | 2004-01-22 06:47:28 +0000 | [diff] [blame] | 162 | u_long written; |
Igor Sysoev | 890fc96 | 2003-07-20 21:15:59 +0000 | [diff] [blame] | 163 | |
| 164 | errstr[len++] = CR; |
| 165 | errstr[len++] = LF; |
| 166 | WriteFile(log->file->fd, errstr, len, &written, NULL); |
| 167 | |
Igor Sysoev | 1c10462 | 2003-06-03 15:42:58 +0000 | [diff] [blame] | 168 | #else |
Igor Sysoev | 890fc96 | 2003-07-20 21:15:59 +0000 | [diff] [blame] | 169 | |
| 170 | errstr[len++] = LF; |
Igor Sysoev | f5e97c5 | 2003-06-26 15:35:36 +0000 | [diff] [blame] | 171 | write(log->file->fd, errstr, len); |
Igor Sysoev | 1c10462 | 2003-06-03 15:42:58 +0000 | [diff] [blame] | 172 | |
Igor Sysoev | a6717c4 | 2002-12-23 06:29:22 +0000 | [diff] [blame] | 173 | #endif |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 174 | } |
| 175 | |
Igor Sysoev | 1c13c66 | 2003-05-20 15:37:55 +0000 | [diff] [blame] | 176 | |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 177 | #if !(HAVE_VARIADIC_MACROS) |
| 178 | |
| 179 | void ngx_log_error(int level, ngx_log_t *log, ngx_err_t err, |
| 180 | const char *fmt, ...) |
| 181 | { |
| 182 | va_list args; |
| 183 | |
| 184 | if (log->log_level >= level) { |
| 185 | va_start(args, fmt); |
| 186 | ngx_log_error_core(level, log, err, fmt, args); |
| 187 | va_end(args); |
| 188 | } |
| 189 | } |
| 190 | |
Igor Sysoev | 1c13c66 | 2003-05-20 15:37:55 +0000 | [diff] [blame] | 191 | |
Igor Sysoev | 865c150 | 2003-11-30 20:03:18 +0000 | [diff] [blame] | 192 | void ngx_log_debug_core(ngx_log_t *log, ngx_err_t err, const char *fmt, ...) |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 193 | { |
| 194 | va_list args; |
| 195 | |
| 196 | va_start(args, fmt); |
Igor Sysoev | 865c150 | 2003-11-30 20:03:18 +0000 | [diff] [blame] | 197 | ngx_log_error_core(NGX_LOG_DEBUG, log, err, fmt, args); |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 198 | va_end(args); |
| 199 | } |
| 200 | |
Igor Sysoev | 1c13c66 | 2003-05-20 15:37:55 +0000 | [diff] [blame] | 201 | |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 202 | void ngx_assert_core(ngx_log_t *log, const char *fmt, ...) |
| 203 | { |
| 204 | va_list args; |
| 205 | |
| 206 | va_start(args, fmt); |
| 207 | ngx_log_error_core(NGX_LOG_ALERT, log, 0, fmt, args); |
| 208 | va_end(args); |
| 209 | } |
| 210 | |
| 211 | #endif |
Igor Sysoev | 1c13c66 | 2003-05-20 15:37:55 +0000 | [diff] [blame] | 212 | |
| 213 | |
Igor Sysoev | 1c10462 | 2003-06-03 15:42:58 +0000 | [diff] [blame] | 214 | #if 0 |
| 215 | |
Igor Sysoev | 1c13c66 | 2003-05-20 15:37:55 +0000 | [diff] [blame] | 216 | void ngx_log_stderr(ngx_event_t *ev) |
| 217 | { |
| 218 | char errstr[MAX_ERROR_STR]; |
| 219 | ssize_t n; |
| 220 | ngx_err_t err; |
| 221 | |
| 222 | for ( ;; ) { |
| 223 | n = read((ngx_fd_t) ev->data, errstr, sizeof(errstr - 1)); |
| 224 | |
| 225 | if (n == -1) { |
Igor Sysoev | fa73aac | 2003-05-21 13:28:21 +0000 | [diff] [blame] | 226 | err = ngx_errno; |
Igor Sysoev | 1c13c66 | 2003-05-20 15:37:55 +0000 | [diff] [blame] | 227 | if (err == NGX_EAGAIN) { |
| 228 | return; |
| 229 | } |
| 230 | |
| 231 | ngx_log_error(NGX_LOG_ALERT, &ngx_log, err, "read() failed"); |
| 232 | return; |
| 233 | } |
| 234 | |
| 235 | if (n == 0) { |
| 236 | ngx_log_error(NGX_LOG_ALERT, &ngx_log, 0, "stderr clolsed"); |
| 237 | return; |
| 238 | } |
| 239 | |
| 240 | errstr[n] = '\0'; |
| 241 | ngx_log_error(NGX_LOG_STDERR, &ngx_log, 0, "%s", errstr); |
| 242 | } |
| 243 | } |
Igor Sysoev | 1c10462 | 2003-06-03 15:42:58 +0000 | [diff] [blame] | 244 | |
| 245 | #endif |
| 246 | |
| 247 | |
Igor Sysoev | 1c10462 | 2003-06-03 15:42:58 +0000 | [diff] [blame] | 248 | |
| 249 | ngx_log_t *ngx_log_init_errlog() |
| 250 | { |
| 251 | #if (WIN32) |
Igor Sysoev | be2cfc3 | 2003-06-15 18:32:13 +0000 | [diff] [blame] | 252 | |
Igor Sysoev | f5e97c5 | 2003-06-26 15:35:36 +0000 | [diff] [blame] | 253 | ngx_stderr.fd = GetStdHandle(STD_ERROR_HANDLE); |
Igor Sysoev | 1c10462 | 2003-06-03 15:42:58 +0000 | [diff] [blame] | 254 | |
Igor Sysoev | f5e97c5 | 2003-06-26 15:35:36 +0000 | [diff] [blame] | 255 | if (ngx_stderr.fd == NGX_INVALID_FILE) { |
Igor Sysoev | 62260f2 | 2003-12-05 17:07:27 +0000 | [diff] [blame] | 256 | /* TODO: where can we log error ? */ |
Igor Sysoev | 1c10462 | 2003-06-03 15:42:58 +0000 | [diff] [blame] | 257 | return NULL; |
| 258 | |
Igor Sysoev | f5e97c5 | 2003-06-26 15:35:36 +0000 | [diff] [blame] | 259 | } else if (ngx_stderr.fd == NULL) { |
Igor Sysoev | 62260f2 | 2003-12-05 17:07:27 +0000 | [diff] [blame] | 260 | |
Igor Sysoev | 1c10462 | 2003-06-03 15:42:58 +0000 | [diff] [blame] | 261 | /* there are no associated standard handles */ |
Igor Sysoev | 62260f2 | 2003-12-05 17:07:27 +0000 | [diff] [blame] | 262 | |
| 263 | /* TODO: where can we can log possible errors ? */ |
Igor Sysoev | 890fc96 | 2003-07-20 21:15:59 +0000 | [diff] [blame] | 264 | |
| 265 | ngx_stderr.fd = NGX_INVALID_FILE; |
Igor Sysoev | 1c10462 | 2003-06-03 15:42:58 +0000 | [diff] [blame] | 266 | } |
| 267 | |
| 268 | #else |
Igor Sysoev | be2cfc3 | 2003-06-15 18:32:13 +0000 | [diff] [blame] | 269 | |
Igor Sysoev | f5e97c5 | 2003-06-26 15:35:36 +0000 | [diff] [blame] | 270 | ngx_stderr.fd = STDERR_FILENO; |
Igor Sysoev | be2cfc3 | 2003-06-15 18:32:13 +0000 | [diff] [blame] | 271 | |
Igor Sysoev | 1c10462 | 2003-06-03 15:42:58 +0000 | [diff] [blame] | 272 | #endif |
| 273 | |
Igor Sysoev | f5e97c5 | 2003-06-26 15:35:36 +0000 | [diff] [blame] | 274 | ngx_log.file = &ngx_stderr; |
Igor Sysoev | 1c10462 | 2003-06-03 15:42:58 +0000 | [diff] [blame] | 275 | ngx_log.log_level = NGX_LOG_INFO; |
Igor Sysoev | 62260f2 | 2003-12-05 17:07:27 +0000 | [diff] [blame] | 276 | |
| 277 | #if 0 |
Igor Sysoev | 1c10462 | 2003-06-03 15:42:58 +0000 | [diff] [blame] | 278 | /* STUB */ ngx_log.log_level = NGX_LOG_DEBUG; |
Igor Sysoev | 62260f2 | 2003-12-05 17:07:27 +0000 | [diff] [blame] | 279 | #endif |
Igor Sysoev | 1c10462 | 2003-06-03 15:42:58 +0000 | [diff] [blame] | 280 | |
| 281 | return &ngx_log; |
| 282 | } |
| 283 | |
| 284 | |
Igor Sysoev | 5f80078 | 2003-12-08 20:48:12 +0000 | [diff] [blame] | 285 | ngx_log_t *ngx_log_create_errlog(ngx_cycle_t *cycle, ngx_array_t *args) |
Igor Sysoev | 96c56c9 | 2003-07-02 14:41:17 +0000 | [diff] [blame] | 286 | { |
| 287 | ngx_log_t *log; |
Igor Sysoev | 5f80078 | 2003-12-08 20:48:12 +0000 | [diff] [blame] | 288 | ngx_str_t *value, *name; |
| 289 | |
| 290 | if (args) { |
| 291 | value = args->elts; |
| 292 | name = &value[1]; |
| 293 | |
| 294 | } else { |
| 295 | name = NULL; |
| 296 | } |
Igor Sysoev | 96c56c9 | 2003-07-02 14:41:17 +0000 | [diff] [blame] | 297 | |
| 298 | ngx_test_null(log, ngx_pcalloc(cycle->pool, sizeof(ngx_log_t)), NULL); |
Igor Sysoev | 890fc96 | 2003-07-20 21:15:59 +0000 | [diff] [blame] | 299 | ngx_test_null(log->file, ngx_conf_open_file(cycle, name), NULL); |
| 300 | |
Igor Sysoev | d8e1f07 | 2004-01-22 06:47:28 +0000 | [diff] [blame] | 301 | #if 0 |
Igor Sysoev | 0911f77 | 2004-01-14 18:19:42 +0000 | [diff] [blame] | 302 | /* STUB */ log->log_level = NGX_LOG_DEBUG | NGX_LOG_DEBUG_CORE | NGX_LOG_DEBUG_ALLOC | NGX_LOG_DEBUG_EVENT | NGX_LOG_DEBUG_HTTP; |
Igor Sysoev | 62260f2 | 2003-12-05 17:07:27 +0000 | [diff] [blame] | 303 | #endif |
Igor Sysoev | 96c56c9 | 2003-07-02 14:41:17 +0000 | [diff] [blame] | 304 | |
| 305 | return log; |
| 306 | } |
| 307 | |
| 308 | |
Igor Sysoev | 340b03b | 2003-07-04 15:10:33 +0000 | [diff] [blame] | 309 | static char *ngx_set_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) |
| 310 | { |
| 311 | ngx_str_t *value; |
| 312 | |
| 313 | value = cf->args->elts; |
| 314 | |
| 315 | if (value[1].len == 6 && ngx_strcmp(value[1].data, "stderr") == 0) { |
| 316 | cf->cycle->log->file = &ngx_stderr; |
| 317 | |
| 318 | } else { |
| 319 | cf->cycle->log->file->name = value[1]; |
| 320 | } |
| 321 | |
Igor Sysoev | 03420a6 | 2004-01-20 20:40:08 +0000 | [diff] [blame] | 322 | return ngx_set_error_log_levels(cf, cf->cycle->log); |
| 323 | } |
| 324 | |
| 325 | |
| 326 | char *ngx_set_error_log_levels(ngx_conf_t *cf, ngx_log_t *log) |
| 327 | { |
| 328 | ngx_int_t i, n, d; |
| 329 | ngx_str_t *value; |
| 330 | |
| 331 | value = cf->args->elts; |
| 332 | |
Igor Sysoev | 5f80078 | 2003-12-08 20:48:12 +0000 | [diff] [blame] | 333 | for (i = 2; i < cf->args->nelts; i++) { |
| 334 | |
| 335 | for (n = 1; n < NGX_LOG_DEBUG; n++) { |
| 336 | if (ngx_strcmp(value[i].data, err_levels[n]) == 0) { |
| 337 | |
Igor Sysoev | 03420a6 | 2004-01-20 20:40:08 +0000 | [diff] [blame] | 338 | if (log->log_level != 0) { |
Igor Sysoev | 5f80078 | 2003-12-08 20:48:12 +0000 | [diff] [blame] | 339 | ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
| 340 | "invalid log level \"%s\"", |
| 341 | value[i].data); |
| 342 | return NGX_CONF_ERROR; |
| 343 | } |
| 344 | |
Igor Sysoev | 03420a6 | 2004-01-20 20:40:08 +0000 | [diff] [blame] | 345 | log->log_level = n; |
Igor Sysoev | 5f80078 | 2003-12-08 20:48:12 +0000 | [diff] [blame] | 346 | continue; |
Igor Sysoev | 62260f2 | 2003-12-05 17:07:27 +0000 | [diff] [blame] | 347 | } |
| 348 | } |
Igor Sysoev | 5f80078 | 2003-12-08 20:48:12 +0000 | [diff] [blame] | 349 | |
Igor Sysoev | d8e1f07 | 2004-01-22 06:47:28 +0000 | [diff] [blame] | 350 | for (n = 0, d = NGX_LOG_DEBUG_FIRST; d <= NGX_LOG_DEBUG_LAST; d <<= 1) { |
| 351 | if (ngx_strcmp(value[i].data, debug_levels[n++]) == 0) { |
Igor Sysoev | 03420a6 | 2004-01-20 20:40:08 +0000 | [diff] [blame] | 352 | if (log->log_level & ~NGX_LOG_DEBUG_ALL) { |
Igor Sysoev | 5f80078 | 2003-12-08 20:48:12 +0000 | [diff] [blame] | 353 | ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
| 354 | "invalid log level \"%s\"", |
| 355 | value[i].data); |
| 356 | return NGX_CONF_ERROR; |
| 357 | } |
| 358 | |
Igor Sysoev | 03420a6 | 2004-01-20 20:40:08 +0000 | [diff] [blame] | 359 | log->log_level |= d; |
Igor Sysoev | 5f80078 | 2003-12-08 20:48:12 +0000 | [diff] [blame] | 360 | } |
| 361 | } |
| 362 | |
| 363 | |
Igor Sysoev | 03420a6 | 2004-01-20 20:40:08 +0000 | [diff] [blame] | 364 | if (log->log_level == 0) { |
Igor Sysoev | 62260f2 | 2003-12-05 17:07:27 +0000 | [diff] [blame] | 365 | ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
Igor Sysoev | 5f80078 | 2003-12-08 20:48:12 +0000 | [diff] [blame] | 366 | "invalid log level \"%s\"", value[i].data); |
Igor Sysoev | 62260f2 | 2003-12-05 17:07:27 +0000 | [diff] [blame] | 367 | return NGX_CONF_ERROR; |
| 368 | } |
Igor Sysoev | 1c10462 | 2003-06-03 15:42:58 +0000 | [diff] [blame] | 369 | } |
| 370 | |
Igor Sysoev | 1c10462 | 2003-06-03 15:42:58 +0000 | [diff] [blame] | 371 | return NGX_CONF_OK; |
| 372 | } |