Skip to content

Commit 954e18b

Browse files
committed
FPM: Implement configurable access log limit
1 parent b64daf9 commit 954e18b

File tree

3 files changed

+124
-86
lines changed

3 files changed

+124
-86
lines changed

sapi/fpm/fpm/fpm_log.c

Lines changed: 48 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
static char *fpm_log_format = NULL;
2525
static int fpm_log_fd = -1;
2626
static struct key_value_s *fpm_access_suppress_paths = NULL;
27+
static struct zlog_stream fpm_log_stream;
2728

2829
static int fpm_access_log_suppress(struct fpm_scoreboard_proc_s *proc);
2930

@@ -92,7 +93,7 @@ int fpm_log_init_child(struct fpm_worker_pool_s *wp) /* {{{ */
9293
if (fpm_log_fd == -1) {
9394
fpm_log_fd = wp->log_fd;
9495
}
95-
96+
zlog_stream_init_ex(&fpm_log_stream, ZLOG_ACCESS_LOG, fpm_log_fd);
9697

9798
for (wp = fpm_worker_all_pools; wp; wp = wp->next) {
9899
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) /* {{{ */
107108

108109
int fpm_log_write(char *log_format) /* {{{ */
109110
{
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;
114113
struct fpm_scoreboard_proc_s proc, *proc_p;
115114
struct fpm_scoreboard_s *scoreboard;
115+
struct zlog_stream *stream;
116116
char tmp[129];
117117
char format[129];
118118
time_t now_epoch;
@@ -126,9 +126,9 @@ int fpm_log_write(char *log_format) /* {{{ */
126126

127127
if (!log_format) {
128128
log_format = fpm_log_format;
129-
test = 0;
129+
test = false;
130130
} else {
131-
test = 1;
131+
test = true;
132132
}
133133

134134
now_epoch = time(NULL);
@@ -152,38 +152,25 @@ int fpm_log_write(char *log_format) /* {{{ */
152152
}
153153
}
154154

155-
token = 0;
156-
157-
memset(buffer, '\0', sizeof(buffer));
158-
b = buffer;
159-
len = 0;
160-
161155

162156
s = log_format;
157+
stream = &fpm_log_stream;
158+
zlog_stream_start(stream);
163159

164160
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-
172161
if (!token && *s == '%') {
173-
token = 1;
162+
token = false;
174163
memset(format, '\0', sizeof(format)); /* reset format */
175164
s++;
176165
continue;
177166
}
178167

179168
if (token) {
180-
token = 0;
181-
len2 = 0;
169+
token = false;
182170
switch (*s) {
183171

184172
case '%': /* '%' */
185-
*b = '%';
186-
len2 = 1;
173+
zlog_stream_char(stream, '%');
187174
break;
188175

189176
#ifdef HAVE_TIMES
@@ -207,7 +194,7 @@ int fpm_log_write(char *log_format) /* {{{ */
207194

208195
format[0] = '\0';
209196
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.);
211198
}
212199
break;
213200
#endif
@@ -216,7 +203,7 @@ int fpm_log_write(char *log_format) /* {{{ */
216203
/* seconds */
217204
if (format[0] == '\0' || !strcasecmp(format, "seconds")) {
218205
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.);
220207
}
221208

222209
/* milliseconds */
@@ -225,13 +212,13 @@ int fpm_log_write(char *log_format) /* {{{ */
225212
!strcasecmp(format, "miliseconds") || !strcasecmp(format, "mili")
226213
) {
227214
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.);
229216
}
230217

231218
/* microseconds */
232219
} else if (!strcasecmp(format, "microseconds") || !strcasecmp(format, "micro")) {
233220
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));
235222
}
236223

237224
} else {
@@ -249,46 +236,46 @@ int fpm_log_write(char *log_format) /* {{{ */
249236

250237
if (!test) {
251238
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 : "-");
253240
}
254241
format[0] = '\0';
255242
break;
256243

257244
case 'f': /* script */
258245
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 : "-");
260247
}
261248
break;
262249

263250
case 'l': /* content length */
264251
if (!test) {
265-
len2 = snprintf(b, FPM_LOG_BUFFER - len, "%zu", proc.content_length);
252+
zlog_stream_format(stream, "%zu", proc.content_length);
266253
}
267254
break;
268255

269256
case 'm': /* method */
270257
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 : "-");
272259
}
273260
break;
274261

275262
case 'M': /* memory */
276263
/* seconds */
277264
if (format[0] == '\0' || !strcasecmp(format, "bytes")) {
278265
if (!test) {
279-
len2 = snprintf(b, FPM_LOG_BUFFER - len, "%zu", proc.memory);
266+
zlog_stream_format(stream, "%zu", proc.memory);
280267
}
281268

282269
/* kilobytes */
283270
} else if (!strcasecmp(format, "kilobytes") || !strcasecmp(format, "kilo")) {
284271
if (!test) {
285-
len2 = snprintf(b, FPM_LOG_BUFFER - len, "%zu", proc.memory / 1024);
272+
zlog_stream_format(stream, "%zu", proc.memory / 1024);
286273
}
287274

288275
/* megabytes */
289276
} else if (!strcasecmp(format, "megabytes") || !strcasecmp(format, "mega")) {
290277
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);
292279
}
293280

294281
} else {
@@ -300,7 +287,7 @@ int fpm_log_write(char *log_format) /* {{{ */
300287

301288
case 'n': /* pool name */
302289
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 : "-");
304291
}
305292
break;
306293

@@ -314,6 +301,7 @@ int fpm_log_write(char *log_format) /* {{{ */
314301
zend_llist_position pos;
315302
sapi_headers_struct *sapi_headers = &SG(sapi_headers);
316303
size_t format_len = strlen(format);
304+
ssize_t written = 0;
317305

318306
h = (sapi_header_struct*)zend_llist_get_first_ex(&sapi_headers->headers, &pos);
319307
while (h) {
@@ -339,59 +327,58 @@ int fpm_log_write(char *log_format) /* {{{ */
339327
}
340328

341329
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 : "-");
343331

344332
/* found, done */
345333
break;
346334
}
347-
if (!len2) {
348-
len2 = 1;
349-
*b = '-';
335+
if (!written) {
336+
zlog_stream_char(stream, '-');
350337
}
351338
}
352339
format[0] = '\0';
353340
break;
354341

355342
case 'p': /* PID */
356343
if (!test) {
357-
len2 = snprintf(b, FPM_LOG_BUFFER - len, "%ld", (long)getpid());
344+
zlog_stream_format(stream, "%ld", (long)getpid());
358345
}
359346
break;
360347

361348
case 'P': /* PID */
362349
if (!test) {
363-
len2 = snprintf(b, FPM_LOG_BUFFER - len, "%ld", (long)getppid());
350+
zlog_stream_format(stream, "%ld", (long)getppid());
364351
}
365352
break;
366353

367354
case 'q': /* query_string */
368355
if (!test) {
369-
len2 = snprintf(b, FPM_LOG_BUFFER - len, "%s", proc.query_string);
356+
zlog_stream_cstr(stream, proc.query_string);
370357
}
371358
break;
372359

373360
case 'Q': /* '?' */
374361
if (!test) {
375-
len2 = snprintf(b, FPM_LOG_BUFFER - len, "%s", *proc.query_string ? "?" : "");
362+
zlog_stream_cstr(stream, *proc.query_string ? "?" : "");
376363
}
377364
break;
378365

379366
case 'r': /* request URI */
380367
if (!test) {
381-
len2 = snprintf(b, FPM_LOG_BUFFER - len, "%s", proc.request_uri);
368+
zlog_stream_cstr(stream, proc.request_uri);
382369
}
383370
break;
384371

385372
case 'R': /* remote IP address */
386373
if (!test) {
387374
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 : "-");
389376
}
390377
break;
391378

392379
case 's': /* status */
393380
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);
395382
}
396383
break;
397384

@@ -409,14 +396,14 @@ int fpm_log_write(char *log_format) /* {{{ */
409396
} else {
410397
strftime(tmp, sizeof(tmp) - 1, format, localtime(t));
411398
}
412-
len2 = snprintf(b, FPM_LOG_BUFFER - len, "%s", tmp);
399+
zlog_stream_cstr(stream, tmp);
413400
}
414401
format[0] = '\0';
415402
break;
416403

417404
case 'u': /* remote user */
418405
if (!test) {
419-
len2 = snprintf(b, FPM_LOG_BUFFER - len, "%s", proc.auth_user);
406+
zlog_stream_cstr(stream, proc.auth_user);
420407
}
421408
break;
422409

@@ -459,30 +446,28 @@ int fpm_log_write(char *log_format) /* {{{ */
459446
return -1;
460447
}
461448
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.");
469452
break;
470453
}
471454
continue;
472455
}
473456

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+
474462
if (!test) {
475463
// push the normal char to the output buffer
476-
*b = *s;
477-
b++;
478-
len++;
464+
zlog_stream_char(stream, *s);
479465
}
480466
s++;
481467
}
482468

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);
486471
}
487472

488473
return 0;

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy