ngx_int_t ngx_http_log_handler(ngx_http_request_t *r) { u_char *line, *p; size_t len; ngx_uint_t i, l; ngx_http_log_t *log; ngx_open_file_t *file; ngx_http_log_op_t *op; ngx_http_log_loc_conf_t *lcf; ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "http log handler"); lcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module); if (lcf->off) { return NGX_OK; } log = lcf->logs->elts; for (l = 0; l < lcf->logs->nelts; l++) { if (ngx_time() == log[l].disk_full_time) { /* * on FreeBSD writing to a full filesystem with enabled softupdates * may block process for much longer time than writing to non-full * filesystem, so we skip writing to a log for one second */ continue; } ngx_http_script_flush_no_cacheable_variables(r, log[l].format->flushes); len = 0; op = log[l].format->ops->elts; for (i = 0; i < log[l].format->ops->nelts; i++) { if (op[i].len == 0) { len += op[i].getlen(r, op[i].data); } else { len += op[i].len; } } len += NGX_LINEFEED_SIZE; file = log[l].file; if (file && file->buffer) { if (len > (size_t) (file->last - file->pos)) { ngx_http_log_write(r, &log[l], file->buffer, file->pos - file->buffer); file->pos = file->buffer; } if (len <= (size_t) (file->last - file->pos)) { p = file->pos; for (i = 0; i < log[l].format->ops->nelts; i++) { p = op[i].run(r, p, &op[i]); } ngx_linefeed(p); file->pos = p; continue; } } line = ngx_pnalloc(r->pool, len); if (line == NULL) { return NGX_ERROR; } p = line; for (i = 0; i < log[l].format->ops->nelts; i++) { p = op[i].run(r, p, &op[i]); } ngx_linefeed(p); ngx_http_log_write(r, &log[l], line, p - line); } return NGX_OK; }
static ngx_int_t ngx_http_log_handler(ngx_http_request_t *r) { u_char *line, *p; size_t len; ngx_uint_t i, l, bypass, threshold; ngx_http_log_t *log; ngx_open_file_t *file; ngx_http_log_op_t *op; ngx_http_log_loc_conf_t *lcf; ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "http log handler"); lcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module); if (lcf->off) { return NGX_OK; } if (r->headers_out.status == NGX_HTTP_BAD_REQUEST && !lcf->log_empty_request && (r->header_in && r->header_in->last == r->header_in->start)) { return NGX_OK; } log = lcf->logs->elts; for (l = 0; l < lcf->logs->nelts; l++) { if (log[l].scope != 0) { bypass = 1; if (log[l].sample_count < log[l].sample) { if (log[l].scatter_count++ == 0) { bypass = 0; ++log[l].sample_count; } threshold = log[l].scatter; if (log[l].sample_count >= log[l].inflexion) { --threshold; } if (log[l].scatter_count == threshold) { log[l].scatter_count = 0; } } if (++log[l].scope_count == log[l].scope) { log[l].scope_count = 0; log[l].sample_count = 0; log[l].scatter_count = 0; } if (bypass == 1) { continue; } } if (ngx_time() == log[l].disk_full_time) { /* * on FreeBSD writing to a full filesystem with enabled softupdates * may block process for much longer time than writing to non-full * filesystem, so we skip writing to a log for one second */ continue; } ngx_http_script_flush_no_cacheable_variables(r, log[l].format->flushes); len = 0; op = log[l].format->ops->elts; for (i = 0; i < log[l].format->ops->nelts; i++) { if (op[i].len == 0) { len += op[i].getlen(r, op[i].data); } else { len += op[i].len; } } len += NGX_LINEFEED_SIZE; file = log[l].file; if (file && file->buffer) { if (len > (size_t) (file->last - file->pos)) { ngx_http_log_write(r, &log[l], file->buffer, file->pos - file->buffer); file->pos = file->buffer; } if (len <= (size_t) (file->last - file->pos)) { p = file->pos; for (i = 0; i < log[l].format->ops->nelts; i++) { p = op[i].run(r, p, &op[i]); } ngx_linefeed(p); file->pos = p; continue; } } line = ngx_pnalloc(r->pool, len); if (line == NULL) { return NGX_ERROR; } p = line; for (i = 0; i < log[l].format->ops->nelts; i++) { p = op[i].run(r, p, &op[i]); } ngx_linefeed(p); #if (NGX_SYSLOG) if (log[l].syslog != NULL) { if (!(log[l].syslog->fd == NGX_INVALID_FILE && ngx_cached_time->sec < log[l].syslog->next_try)) { (void) ngx_write_syslog(log[l].syslog, line, p - line); } continue; } #endif ngx_http_log_write(r, &log[l], line, p - line); } return NGX_OK; }