Mercurial > hg > nginx
comparison src/core/ngx_log.c @ 236:86e473b5641e
nginx-0.0.1-2004-01-22-09:47:28 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Thu, 22 Jan 2004 06:47:28 +0000 |
parents | 6bd5d25b6744 |
children | 2a0540287298 |
comparison
equal
deleted
inserted
replaced
235:6bd5d25b6744 | 236:86e473b5641e |
---|---|
1 | 1 |
2 #include <ngx_config.h> | 2 #include <ngx_config.h> |
3 #include <ngx_core.h> | 3 #include <ngx_core.h> |
4 | 4 |
5 | 5 |
6 ngx_inline static int ngx_log_is_full(ngx_log_t *log, char *errstr, size_t len); | 6 static void ngx_log_write(ngx_log_t *log, char *errstr, size_t len); |
7 static char *ngx_set_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); | 7 static char *ngx_set_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); |
8 | 8 |
9 | 9 |
10 static ngx_str_t errlog_name = ngx_string("errlog"); | 10 static ngx_str_t errlog_name = ngx_string("errlog"); |
11 | 11 |
53 void ngx_log_error_core(int level, ngx_log_t *log, ngx_err_t err, | 53 void ngx_log_error_core(int level, ngx_log_t *log, ngx_err_t err, |
54 const char *fmt, va_list args) | 54 const char *fmt, va_list args) |
55 #endif | 55 #endif |
56 { | 56 { |
57 char errstr[MAX_ERROR_STR]; | 57 char errstr[MAX_ERROR_STR]; |
58 size_t len; | 58 size_t len, max; |
59 #if (HAVE_VARIADIC_MACROS) | 59 #if (HAVE_VARIADIC_MACROS) |
60 va_list args; | 60 va_list args; |
61 #endif | 61 #endif |
62 #if (WIN32) | |
63 u_long written; | |
64 #endif | |
65 | 62 |
66 if (log->file->fd == NGX_INVALID_FILE) { | 63 if (log->file->fd == NGX_INVALID_FILE) { |
67 return; | 64 return; |
68 } | 65 } |
69 | 66 |
70 ngx_memcpy(errstr, ngx_cached_err_log_time.data, | 67 ngx_memcpy(errstr, ngx_cached_err_log_time.data, |
71 ngx_cached_err_log_time.len); | 68 ngx_cached_err_log_time.len); |
72 | 69 |
70 #if (WIN32) | |
71 max = MAX_ERROR_STR - 2; | |
72 #else | |
73 max = MAX_ERROR_STR - 1; | |
74 #endif | |
75 | |
73 len = ngx_cached_err_log_time.len; | 76 len = ngx_cached_err_log_time.len; |
74 | 77 |
75 len += ngx_snprintf(errstr + len, sizeof(errstr) - len - 1, | 78 len += ngx_snprintf(errstr + len, max - len, " [%s] ", err_levels[level]); |
76 " [%s] ", err_levels[level]); | |
77 | 79 |
78 /* pid#tid */ | 80 /* pid#tid */ |
79 len += ngx_snprintf(errstr + len, sizeof(errstr) - len - 1, | 81 len += ngx_snprintf(errstr + len, max - len, |
80 PID_T_FMT "#%d: ", ngx_getpid(), /* STUB */ 0); | 82 PID_T_FMT "#%d: ", ngx_getpid(), /* STUB */ 0); |
81 | 83 |
82 if (log->data) { | 84 if (log->data) { |
83 len += ngx_snprintf(errstr + len, sizeof(errstr) - len - 1, | 85 len += ngx_snprintf(errstr + len, max - len, |
84 "*%u ", * (u_int *) log->data); | 86 "*%u ", * (u_int *) log->data); |
85 } | 87 } |
86 | 88 |
87 #if (HAVE_VARIADIC_MACROS) | 89 #if (HAVE_VARIADIC_MACROS) |
88 | 90 |
89 va_start(args, fmt); | 91 va_start(args, fmt); |
90 len += ngx_vsnprintf(errstr + len, sizeof(errstr) - len - 1, fmt, args); | 92 len += ngx_vsnprintf(errstr + len, max - len, fmt, args); |
91 va_end(args); | 93 va_end(args); |
92 | 94 |
93 #else | 95 #else |
94 | 96 |
95 len += ngx_vsnprintf(errstr + len, sizeof(errstr) - len - 1, fmt, args); | 97 len += ngx_vsnprintf(errstr + len, max - len, fmt, args); |
96 | 98 |
97 #endif | 99 #endif |
98 | 100 |
99 if (err) { | 101 if (err) { |
100 | 102 |
101 if (len > sizeof(errstr) - 50) { | 103 if (len > max - 50) { |
102 /* leave a space for an error code */ | 104 /* leave a space for an error code */ |
103 len = sizeof(errstr) - 50; | 105 len = max - 50; |
104 errstr[len++] = '.'; | 106 errstr[len++] = '.'; |
105 errstr[len++] = '.'; | 107 errstr[len++] = '.'; |
106 errstr[len++] = '.'; | 108 errstr[len++] = '.'; |
107 } | 109 } |
108 | 110 |
109 #if (WIN32) | 111 #if (WIN32) |
110 if ((unsigned) err >= 0x80000000) { | 112 if ((unsigned) err >= 0x80000000) { |
111 len += ngx_snprintf(errstr + len, sizeof(errstr) - len - 1, | 113 len += ngx_snprintf(errstr + len, max - len, " (%X: ", err); |
112 " (%X: ", err); | |
113 } else { | 114 } else { |
114 len += ngx_snprintf(errstr + len, sizeof(errstr) - len - 1, | 115 len += ngx_snprintf(errstr + len, max - len, " (%d: ", err); |
115 " (%d: ", err); | 116 } |
116 } | 117 #else |
117 #else | 118 len += ngx_snprintf(errstr + len, max - len, " (%d: ", err); |
118 len += ngx_snprintf(errstr + len, sizeof(errstr) - len - 1, | 119 #endif |
119 " (%d: ", err); | 120 |
120 #endif | 121 if (len >= max) { |
121 | 122 ngx_log_write(log, errstr, max); |
122 if (ngx_log_is_full(log, errstr, len)) { | 123 return; |
123 return; | 124 } |
124 } | 125 |
125 | 126 len += ngx_strerror_r(err, errstr + len, max - len); |
126 len += ngx_strerror_r(err, errstr + len, sizeof(errstr) - len - 1); | 127 |
127 | 128 if (len >= max) { |
128 if (ngx_log_is_full(log, errstr, len)) { | 129 ngx_log_write(log, errstr, max); |
129 return; | 130 return; |
130 } | 131 } |
131 | 132 |
132 errstr[len++] = ')'; | 133 errstr[len++] = ')'; |
133 | 134 |
134 if (ngx_log_is_full(log, errstr, len)) { | 135 if (len >= max) { |
136 ngx_log_write(log, errstr, max); | |
135 return; | 137 return; |
136 } | 138 } |
137 | 139 |
138 } else { | 140 } else { |
139 if (ngx_log_is_full(log, errstr, len)) { | 141 if (len >= max) { |
142 ngx_log_write(log, errstr, max); | |
140 return; | 143 return; |
141 } | 144 } |
142 } | 145 } |
143 | 146 |
144 if (level != NGX_LOG_DEBUG && log->handler) { | 147 if (level != NGX_LOG_DEBUG && log->handler) { |
145 len += log->handler(log->data, errstr + len, sizeof(errstr) - len - 1); | 148 len += log->handler(log->data, errstr + len, max - len); |
146 | 149 |
147 if (ngx_log_is_full(log, errstr, len)) { | 150 if (len >= max) { |
148 return; | 151 len = max; |
149 } | 152 } |
150 } | 153 } |
151 | 154 |
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 { | |
152 #if (WIN32) | 161 #if (WIN32) |
162 u_long written; | |
153 | 163 |
154 errstr[len++] = CR; | 164 errstr[len++] = CR; |
155 errstr[len++] = LF; | 165 errstr[len++] = LF; |
156 WriteFile(log->file->fd, errstr, len, &written, NULL); | 166 WriteFile(log->file->fd, errstr, len, &written, NULL); |
157 | 167 |
159 | 169 |
160 errstr[len++] = LF; | 170 errstr[len++] = LF; |
161 write(log->file->fd, errstr, len); | 171 write(log->file->fd, errstr, len); |
162 | 172 |
163 #endif | 173 #endif |
164 } | |
165 | |
166 | |
167 ngx_inline static int ngx_log_is_full(ngx_log_t *log, char *errstr, size_t len) | |
168 { | |
169 #if (WIN32) | |
170 u_long written; | |
171 | |
172 if (len > MAX_ERROR_STR - 2) { | |
173 len = MAX_ERROR_STR - 2; | |
174 | |
175 errstr[len++] = CR; | |
176 errstr[len++] = LF; | |
177 WriteFile(log->file->fd, errstr, len, &written, NULL); | |
178 | |
179 return 1; | |
180 } | |
181 | |
182 #else | |
183 | |
184 if (len > MAX_ERROR_STR - 1) { | |
185 len = MAX_ERROR_STR - 1; | |
186 | |
187 errstr[len++] = LF; | |
188 write(log->file->fd, errstr, len); | |
189 | |
190 return 1; | |
191 } | |
192 | |
193 #endif | |
194 | |
195 return 0; | |
196 } | 174 } |
197 | 175 |
198 | 176 |
199 #if !(HAVE_VARIADIC_MACROS) | 177 #if !(HAVE_VARIADIC_MACROS) |
200 | 178 |
318 } | 296 } |
319 | 297 |
320 ngx_test_null(log, ngx_pcalloc(cycle->pool, sizeof(ngx_log_t)), NULL); | 298 ngx_test_null(log, ngx_pcalloc(cycle->pool, sizeof(ngx_log_t)), NULL); |
321 ngx_test_null(log->file, ngx_conf_open_file(cycle, name), NULL); | 299 ngx_test_null(log->file, ngx_conf_open_file(cycle, name), NULL); |
322 | 300 |
323 #if 1 | 301 #if 0 |
324 /* STUB */ log->log_level = NGX_LOG_DEBUG | NGX_LOG_DEBUG_CORE | NGX_LOG_DEBUG_ALLOC | NGX_LOG_DEBUG_EVENT | NGX_LOG_DEBUG_HTTP; | 302 /* STUB */ log->log_level = NGX_LOG_DEBUG | NGX_LOG_DEBUG_CORE | NGX_LOG_DEBUG_ALLOC | NGX_LOG_DEBUG_EVENT | NGX_LOG_DEBUG_HTTP; |
325 #endif | 303 #endif |
326 | 304 |
327 return log; | 305 return log; |
328 } | 306 } |
367 log->log_level = n; | 345 log->log_level = n; |
368 continue; | 346 continue; |
369 } | 347 } |
370 } | 348 } |
371 | 349 |
372 d = NGX_LOG_DEBUG_FIRST; | 350 for (n = 0, d = NGX_LOG_DEBUG_FIRST; d <= NGX_LOG_DEBUG_LAST; d <<= 1) { |
373 for (n = 0; n < /* STUB */ 4; n++) { | 351 if (ngx_strcmp(value[i].data, debug_levels[n++]) == 0) { |
374 if (ngx_strcmp(value[i].data, debug_levels[n]) == 0) { | |
375 if (log->log_level & ~NGX_LOG_DEBUG_ALL) { | 352 if (log->log_level & ~NGX_LOG_DEBUG_ALL) { |
376 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | 353 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
377 "invalid log level \"%s\"", | 354 "invalid log level \"%s\"", |
378 value[i].data); | 355 value[i].data); |
379 return NGX_CONF_ERROR; | 356 return NGX_CONF_ERROR; |
380 } | 357 } |
381 | 358 |
382 log->log_level |= d; | 359 log->log_level |= d; |
383 } | 360 } |
384 | |
385 d <<= 1; | |
386 } | 361 } |
387 | 362 |
388 | 363 |
389 if (log->log_level == 0) { | 364 if (log->log_level == 0) { |
390 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | 365 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |