С помощью log_format
можно включить ряд переменных, таких как $http_user_agent:
http://nginx.org/en/docs/http/ngx_http_core_module.html#variables
Но возможно ли включить переменную из PHP-FPM?
Например, я хочу включить ID пользователя и информацию о времени в access_log
.
Одна из возможностей - установить заголовок в PHP, а затем использовать $sent_http_XXX:
log_format inc_info '... [$sent_http_x_user_id] ...';
access_log /var/log/nginx/access.log inc_info;
<?php
header('X-User-ID: ' . head(USER_ID));
?>
Где вы, вероятно, должны использовать proxy_hide_header
, чтобы остановить отправку этих заголовков клиенту.
Но этот подход, основанный на заголовках, не работает, если заголовки уже были отправлены. Например, я использую register_shutdown_function()
в PHP для регистрации времени обработки.
В качестве отступления, если вам нужно только время обработки, то $upstream_response_time может быть полезен.
Для сравнения, в Apache это можно сделать через:
LogFormat "... [%{USER_ID}n] ..." inc_info
CustomLog /var/log/httpd/access_log inc_info
С помощью соответствующего PHP:
if (function_exists('apache_note')) {
apache_note('USER_ID', USER_ID);
}
Хотя apache_note()
доступен только в mod_php, и не работает с PHP-FPM.
При использовании PHP-FPM вы можете отправлять только заголовки, а затем содержимое.
Теперь я использую отдельный файл журнала, созданный с помощью PHP, в который можно в любой момент записать - даже после отправки заголовков и содержимого.
Это особенно полезно при использовании fastcgi_finish_request ()
, который позволяет вам вернуть страницу пользователю (возможно, страницу «загрузки»), поскольку ваш сценарий продолжает обрабатывать данные.
Чтобы связать журнал доступа к веб-серверу с этим новым файлом журнала, я генерирую уникальный (ish) код для каждого запроса, отправляю его как заголовок (для регистрации в журналах доступа к веб-серверам) и записываю его в Также файл журнала PHP.