Nginx Log Post
Nginx Log POST
Иногдя нужно логгирировать (обычно для дебага) что отправляют через POST
Вот пример
log_format postdata escape=json '"$request" $status' ' [REQUEST BODY]: $request_body';
Если получен пустой $request_body то это означает что (в одном из случаев) nginx посчтал что ему не нужно разбирать запрос.
В этом случае можно прибегнуть к трюку с проксированием на самого себя
server { listen 25001 default_server; root /var/www/html; server_name _; access_log /var/log/nginx/github-to-jenkins-proxy-access.log postdata; error_log /var/log/nginx/github-to-jenkins-proxy-error.log; location /webhook { client_body_buffer_size 64k; client_body_in_single_buffer on; proxy_pass http://127.0.0.1:25001/real-webhook; } location /real-webhook { client_body_buffer_size 64k; client_body_in_single_buffer on; return 200 $request_body; } }
Возможно нужно бужет покрутить client_body_buffer_size 64k;
Но после добавления директивы access_log в нужное место произошло странное — часть запросов логировалась нормально,
а для части из них $request_body оказывался пустым. Дело оказалось в том, что NGINX сохраняет в переменную $request_body
только запросы ограниченной длины, по умолчанию 8 или 16 кб. Для более тяжёлых запросов не сохраняется ничего.
Логгирование ответа от backend/upstream
Иногода (обычно для дебага) нужно логгировать не только запросы но и ответы от бекенда
Сделать это на "голом" nginx у меня не получилось - только используя Lua.
Другими словами в некоторых сборках docker images может потребоваться замена версии nginx (OpenResty).
http { ... log_format bodylog '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" $request_time ' '<"$request_body" >"$resp_body"'; lua_need_request_body on; set $resp_body ""; body_filter_by_lua ' local resp_body = string.sub(ngx.arg[1], 1, 1000) ngx.ctx.buffered = (ngx.ctx.buffered or "") .. resp_body if ngx.arg[2] then ngx.var.resp_body = ngx.ctx.buffered end '; ... }
server { listen 1.2.3.4; location / { proxy_pass http://127.0.0.1:3000; access_log /var/log/nginx/server.log bodylog; }