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