Really logging the POST request body (instead of "-") with nginx
Nginx doesn't parse the client request body unless it really needs to, so it usually does not fill the $request_body
variable.
The exceptions are when:
- it sends the request to a proxy,
- or a fastcgi server.
So you really need to either add the proxy_pass
or fastcgi_pass
directives to your block.
The easiest way is to send it to Nginx itself as a proxied server, for example with this configuration:
location = /c.gif {
access_log logs/uaa_access.log client;
# add the proper port or IP address if Nginx is not on 127.0.0.1:80
proxy_pass http://127.0.0.1/post_gif;
}
location = /post_gif {
# turn off logging here to avoid double logging
access_log off;
empty_gif;
}
If you only expect to receive some key-pair values, it might be a good idea to limit the request body size:
client_max_body_size 1k;
client_body_buffer_size 1k;
client_body_in_single_buffer on;
I also received "405 Not Allowed" errors when testing using empty_gif;
and curl (it was ok from the browser), I switched it to return 200;
to properly test with curl.
Shawn
Updated on August 29, 2020Comments
-
Shawn over 3 years
I'm trying to log POST body, and add
$request_body
to thelog_format
inhttp
clause, but theaccess_log
command just prints "-" as the body after I send POST request using:curl -d name=xxxx myip/my_location
My log_format (in
http
clause):log_format client '$remote_addr - $remote_user $request_time $upstream_response_time ' '[$time_local] "$request" $status $body_bytes_sent $request_body "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
My location definition(in server clause):
location = /c.gif { empty_gif; access_log logs/uaa_access.log client; }
How can I print the actual POST data from curl?
-
Abhi over 7 yearsI tried using the same, but in my nginx logs I still find request_body to be empty .
-
Abhi over 7 yearsI want to log the "response content" which is a json, to the nginx log. example: http://<some_ip>/prod/get_sources gives me JSON containing list of sources. How can I log this into the nginx log.
-
Capilé over 7 yearsNo, this method can't be used to log the output of your application, just the input it receives, like a REST request using PUT/POST as json values, even form encoded strings. You may forward data from your application to nginx using error log, though.
-
Abhi over 7 yearssorry but I am new to this, can you tell me more about how can I forward the data to nginx.