24
24
static char * fpm_log_format = NULL ;
25
25
static int fpm_log_fd = -1 ;
26
26
static struct key_value_s * fpm_access_suppress_paths = NULL ;
27
+ static struct zlog_stream fpm_log_stream ;
27
28
28
29
static int fpm_access_log_suppress (struct fpm_scoreboard_proc_s * proc );
29
30
@@ -92,7 +93,7 @@ int fpm_log_init_child(struct fpm_worker_pool_s *wp) /* {{{ */
92
93
if (fpm_log_fd == -1 ) {
93
94
fpm_log_fd = wp -> log_fd ;
94
95
}
95
-
96
+ zlog_stream_init_ex ( & fpm_log_stream , ZLOG_ACCESS_LOG , fpm_log_fd );
96
97
97
98
for (wp = fpm_worker_all_pools ; wp ; wp = wp -> next ) {
98
99
if (wp -> log_fd > -1 && wp -> log_fd != fpm_log_fd ) {
@@ -107,12 +108,11 @@ int fpm_log_init_child(struct fpm_worker_pool_s *wp) /* {{{ */
107
108
108
109
int fpm_log_write (char * log_format ) /* {{{ */
109
110
{
110
- char * s , * b ;
111
- char buffer [FPM_LOG_BUFFER + 1 ];
112
- int token , test ;
113
- size_t len , len2 ;
111
+ char * s ;
112
+ bool test , token = false;
114
113
struct fpm_scoreboard_proc_s proc , * proc_p ;
115
114
struct fpm_scoreboard_s * scoreboard ;
115
+ struct zlog_stream * stream ;
116
116
char tmp [129 ];
117
117
char format [129 ];
118
118
time_t now_epoch ;
@@ -126,9 +126,9 @@ int fpm_log_write(char *log_format) /* {{{ */
126
126
127
127
if (!log_format ) {
128
128
log_format = fpm_log_format ;
129
- test = 0 ;
129
+ test = false ;
130
130
} else {
131
- test = 1 ;
131
+ test = true ;
132
132
}
133
133
134
134
now_epoch = time (NULL );
@@ -152,38 +152,25 @@ int fpm_log_write(char *log_format) /* {{{ */
152
152
}
153
153
}
154
154
155
- token = 0 ;
156
-
157
- memset (buffer , '\0' , sizeof (buffer ));
158
- b = buffer ;
159
- len = 0 ;
160
-
161
155
162
156
s = log_format ;
157
+ stream = & fpm_log_stream ;
158
+ zlog_stream_start (stream );
163
159
164
160
while (* s != '\0' ) {
165
- /* Test is we have place for 1 more char. */
166
- if (len >= FPM_LOG_BUFFER ) {
167
- zlog (ZLOG_NOTICE , "the log buffer is full (%d). The access log request has been truncated." , FPM_LOG_BUFFER );
168
- len = FPM_LOG_BUFFER ;
169
- break ;
170
- }
171
-
172
161
if (!token && * s == '%' ) {
173
- token = 1 ;
162
+ token = false ;
174
163
memset (format , '\0' , sizeof (format )); /* reset format */
175
164
s ++ ;
176
165
continue ;
177
166
}
178
167
179
168
if (token ) {
180
- token = 0 ;
181
- len2 = 0 ;
169
+ token = false;
182
170
switch (* s ) {
183
171
184
172
case '%' : /* '%' */
185
- * b = '%' ;
186
- len2 = 1 ;
173
+ zlog_stream_char (stream , '%' );
187
174
break ;
188
175
189
176
#ifdef HAVE_TIMES
@@ -207,7 +194,7 @@ int fpm_log_write(char *log_format) /* {{{ */
207
194
208
195
format [0 ] = '\0' ;
209
196
if (!test ) {
210
- len2 = snprintf ( b , FPM_LOG_BUFFER - len , "%.2f" , tms_total / fpm_scoreboard_get_tick () / (proc .cpu_duration .tv_sec + proc .cpu_duration .tv_usec / 1000000. ) * 100. );
197
+ zlog_stream_format ( stream , "%.2f" , tms_total / fpm_scoreboard_get_tick () / (proc .cpu_duration .tv_sec + proc .cpu_duration .tv_usec / 1000000. ) * 100. );
211
198
}
212
199
break ;
213
200
#endif
@@ -216,7 +203,7 @@ int fpm_log_write(char *log_format) /* {{{ */
216
203
/* seconds */
217
204
if (format [0 ] == '\0' || !strcasecmp (format , "seconds" )) {
218
205
if (!test ) {
219
- len2 = snprintf ( b , FPM_LOG_BUFFER - len , "%.3f" , proc .duration .tv_sec + proc .duration .tv_usec / 1000000. );
206
+ zlog_stream_format ( stream , "%.3f" , proc .duration .tv_sec + proc .duration .tv_usec / 1000000. );
220
207
}
221
208
222
209
/* milliseconds */
@@ -225,13 +212,13 @@ int fpm_log_write(char *log_format) /* {{{ */
225
212
!strcasecmp (format , "miliseconds" ) || !strcasecmp (format , "mili" )
226
213
) {
227
214
if (!test ) {
228
- len2 = snprintf ( b , FPM_LOG_BUFFER - len , "%.3f" , proc .duration .tv_sec * 1000. + proc .duration .tv_usec / 1000. );
215
+ zlog_stream_format ( stream , "%.3f" , proc .duration .tv_sec * 1000. + proc .duration .tv_usec / 1000. );
229
216
}
230
217
231
218
/* microseconds */
232
219
} else if (!strcasecmp (format , "microseconds" ) || !strcasecmp (format , "micro" )) {
233
220
if (!test ) {
234
- len2 = snprintf ( b , FPM_LOG_BUFFER - len , "%lu" , (unsigned long )(proc .duration .tv_sec * 1000000UL + proc .duration .tv_usec ));
221
+ zlog_stream_format ( stream , "%lu" , (unsigned long )(proc .duration .tv_sec * 1000000UL + proc .duration .tv_usec ));
235
222
}
236
223
237
224
} else {
@@ -249,46 +236,46 @@ int fpm_log_write(char *log_format) /* {{{ */
249
236
250
237
if (!test ) {
251
238
char * env = fcgi_getenv ((fcgi_request * ) SG (server_context ), format , strlen (format ));
252
- len2 = snprintf ( b , FPM_LOG_BUFFER - len , "%s" , env ? env : "-" );
239
+ zlog_stream_cstr ( stream , env ? env : "-" );
253
240
}
254
241
format [0 ] = '\0' ;
255
242
break ;
256
243
257
244
case 'f' : /* script */
258
245
if (!test ) {
259
- len2 = snprintf ( b , FPM_LOG_BUFFER - len , "%s" , * proc .script_filename ? proc .script_filename : "-" );
246
+ zlog_stream_cstr ( stream , * proc .script_filename ? proc .script_filename : "-" );
260
247
}
261
248
break ;
262
249
263
250
case 'l' : /* content length */
264
251
if (!test ) {
265
- len2 = snprintf ( b , FPM_LOG_BUFFER - len , "%zu" , proc .content_length );
252
+ zlog_stream_format ( stream , "%zu" , proc .content_length );
266
253
}
267
254
break ;
268
255
269
256
case 'm' : /* method */
270
257
if (!test ) {
271
- len2 = snprintf ( b , FPM_LOG_BUFFER - len , "%s" , * proc .request_method ? proc .request_method : "-" );
258
+ zlog_stream_cstr ( stream , * proc .request_method ? proc .request_method : "-" );
272
259
}
273
260
break ;
274
261
275
262
case 'M' : /* memory */
276
263
/* seconds */
277
264
if (format [0 ] == '\0' || !strcasecmp (format , "bytes" )) {
278
265
if (!test ) {
279
- len2 = snprintf ( b , FPM_LOG_BUFFER - len , "%zu" , proc .memory );
266
+ zlog_stream_format ( stream , "%zu" , proc .memory );
280
267
}
281
268
282
269
/* kilobytes */
283
270
} else if (!strcasecmp (format , "kilobytes" ) || !strcasecmp (format , "kilo" )) {
284
271
if (!test ) {
285
- len2 = snprintf ( b , FPM_LOG_BUFFER - len , "%zu" , proc .memory / 1024 );
272
+ zlog_stream_format ( stream , "%zu" , proc .memory / 1024 );
286
273
}
287
274
288
275
/* megabytes */
289
276
} else if (!strcasecmp (format , "megabytes" ) || !strcasecmp (format , "mega" )) {
290
277
if (!test ) {
291
- len2 = snprintf ( b , FPM_LOG_BUFFER - len , "%zu" , proc .memory / 1024 / 1024 );
278
+ zlog_stream_format ( stream , "%zu" , proc .memory / 1024 / 1024 );
292
279
}
293
280
294
281
} else {
@@ -300,7 +287,7 @@ int fpm_log_write(char *log_format) /* {{{ */
300
287
301
288
case 'n' : /* pool name */
302
289
if (!test ) {
303
- len2 = snprintf ( b , FPM_LOG_BUFFER - len , "%s" , scoreboard -> pool [0 ] ? scoreboard -> pool : "-" );
290
+ zlog_stream_cstr ( stream , scoreboard -> pool [0 ] ? scoreboard -> pool : "-" );
304
291
}
305
292
break ;
306
293
@@ -314,6 +301,7 @@ int fpm_log_write(char *log_format) /* {{{ */
314
301
zend_llist_position pos ;
315
302
sapi_headers_struct * sapi_headers = & SG (sapi_headers );
316
303
size_t format_len = strlen (format );
304
+ ssize_t written = 0 ;
317
305
318
306
h = (sapi_header_struct * )zend_llist_get_first_ex (& sapi_headers -> headers , & pos );
319
307
while (h ) {
@@ -339,59 +327,58 @@ int fpm_log_write(char *log_format) /* {{{ */
339
327
}
340
328
341
329
header = h -> header + format_len + 2 ;
342
- len2 = snprintf ( b , FPM_LOG_BUFFER - len , "%s" , header && * header ? header : "-" );
330
+ written += zlog_stream_cstr ( stream , header && * header ? header : "-" );
343
331
344
332
/* found, done */
345
333
break ;
346
334
}
347
- if (!len2 ) {
348
- len2 = 1 ;
349
- * b = '-' ;
335
+ if (!written ) {
336
+ zlog_stream_char (stream , '-' );
350
337
}
351
338
}
352
339
format [0 ] = '\0' ;
353
340
break ;
354
341
355
342
case 'p' : /* PID */
356
343
if (!test ) {
357
- len2 = snprintf ( b , FPM_LOG_BUFFER - len , "%ld" , (long )getpid ());
344
+ zlog_stream_format ( stream , "%ld" , (long )getpid ());
358
345
}
359
346
break ;
360
347
361
348
case 'P' : /* PID */
362
349
if (!test ) {
363
- len2 = snprintf ( b , FPM_LOG_BUFFER - len , "%ld" , (long )getppid ());
350
+ zlog_stream_format ( stream , "%ld" , (long )getppid ());
364
351
}
365
352
break ;
366
353
367
354
case 'q' : /* query_string */
368
355
if (!test ) {
369
- len2 = snprintf ( b , FPM_LOG_BUFFER - len , "%s" , proc .query_string );
356
+ zlog_stream_cstr ( stream , proc .query_string );
370
357
}
371
358
break ;
372
359
373
360
case 'Q' : /* '?' */
374
361
if (!test ) {
375
- len2 = snprintf ( b , FPM_LOG_BUFFER - len , "%s" , * proc .query_string ? "?" : "" );
362
+ zlog_stream_cstr ( stream , * proc .query_string ? "?" : "" );
376
363
}
377
364
break ;
378
365
379
366
case 'r' : /* request URI */
380
367
if (!test ) {
381
- len2 = snprintf ( b , FPM_LOG_BUFFER - len , "%s" , proc .request_uri );
368
+ zlog_stream_cstr ( stream , proc .request_uri );
382
369
}
383
370
break ;
384
371
385
372
case 'R' : /* remote IP address */
386
373
if (!test ) {
387
374
const char * tmp = fcgi_get_last_client_ip ();
388
- len2 = snprintf ( b , FPM_LOG_BUFFER - len , "%s" , tmp ? tmp : "-" );
375
+ zlog_stream_cstr ( stream , tmp ? tmp : "-" );
389
376
}
390
377
break ;
391
378
392
379
case 's' : /* status */
393
380
if (!test ) {
394
- len2 = snprintf ( b , FPM_LOG_BUFFER - len , "%d" , SG (sapi_headers ).http_response_code );
381
+ zlog_stream_format ( stream , "%d" , SG (sapi_headers ).http_response_code );
395
382
}
396
383
break ;
397
384
@@ -409,14 +396,14 @@ int fpm_log_write(char *log_format) /* {{{ */
409
396
} else {
410
397
strftime (tmp , sizeof (tmp ) - 1 , format , localtime (t ));
411
398
}
412
- len2 = snprintf ( b , FPM_LOG_BUFFER - len , "%s" , tmp );
399
+ zlog_stream_cstr ( stream , tmp );
413
400
}
414
401
format [0 ] = '\0' ;
415
402
break ;
416
403
417
404
case 'u' : /* remote user */
418
405
if (!test ) {
419
- len2 = snprintf ( b , FPM_LOG_BUFFER - len , "%s" , proc .auth_user );
406
+ zlog_stream_cstr ( stream , proc .auth_user );
420
407
}
421
408
break ;
422
409
@@ -459,30 +446,28 @@ int fpm_log_write(char *log_format) /* {{{ */
459
446
return -1 ;
460
447
}
461
448
s ++ ;
462
- if (!test ) {
463
- b += len2 ;
464
- len += len2 ;
465
- }
466
- if (len >= FPM_LOG_BUFFER ) {
467
- zlog (ZLOG_NOTICE , "the log buffer is full (%d). The access log request has been truncated." , FPM_LOG_BUFFER );
468
- len = FPM_LOG_BUFFER ;
449
+
450
+ if (zlog_stream_is_over_limit (stream )) {
451
+ zlog (ZLOG_NOTICE , "the log buffer is over the configured limit. The access log request has been truncated." );
469
452
break ;
470
453
}
471
454
continue ;
472
455
}
473
456
457
+ if (zlog_stream_is_over_limit (stream )) {
458
+ zlog (ZLOG_NOTICE , "the log buffer is over the configured limit. The access log request has been truncated." );
459
+ break ;
460
+ }
461
+
474
462
if (!test ) {
475
463
// push the normal char to the output buffer
476
- * b = * s ;
477
- b ++ ;
478
- len ++ ;
464
+ zlog_stream_char (stream , * s );
479
465
}
480
466
s ++ ;
481
467
}
482
468
483
- if (!test && strlen (buffer ) > 0 ) {
484
- buffer [len ] = '\n' ;
485
- zend_quiet_write (fpm_log_fd , buffer , len + 1 );
469
+ if (!test ) {
470
+ zlog_stream_finish (stream );
486
471
}
487
472
488
473
return 0 ;
0 commit comments