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,