Skip to content

Instantly share code, notes, and snippets.

@kaichao
Last active September 20, 2024 10:24
Show Gist options
  • Save kaichao/077340aa66e8cdf858577a93a9fe1b0d to your computer and use it in GitHub Desktop.
Save kaichao/077340aa66e8cdf858577a93a9fe1b0d to your computer and use it in GitHub Desktop.
nginx: Log complete request/response with all headers

1. switch nginx image to openresty/openresty

2. add the following to server/location (/etc/nginx/conf.d/default.conf)

   set $req_header "";
   set $resp_header "";
   header_filter_by_lua_block{ 
      local h = ngx.req.get_headers();
      for k, v in pairs(h) do
         ngx.var.req_header = ngx.var.req_header .. k.."="..v.." ";
      end
      local rh = ngx.resp.get_headers();
      for k, v in pairs(rh) do
         ngx.var.resp_header = ngx.var.resp_header .. k.."="..v.." ";
      end
   }

   lua_need_request_body on;
   set $resp_body "";
   body_filter_by_lua_block {
      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
   }

   # access_log  /dev/stdout log_req_resp;
   access_log   /var/log/nginx-access.log log_req_resp;

3. add the following to http (/usr/local/openresty/nginx/conf/nginx.conf)

   log_format log_req_resp '$remote_addr - $remote_user [$time_local] '
      '"$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" '
      '$request_time req_header:"$req_header" resp_header:"$resp_header" '
      'req_body:"$request_body" resp_body:"$resp_body"';   

individual headers

request headers:$http_<header> 
 sent headers: $sent_http_<header>
@kovacs-andras
Copy link

kovacs-andras commented Mar 13, 2023

It works! 谢谢 / many thanks!

@c00kiemonstr
Copy link

After an hour of looking for an answer, this is what I needed. Thank you!

@zwurv
Copy link

zwurv commented Nov 23, 2023

This works great, thanks :)

@AronllStone
Copy link

You are a rock! Thanks!

@mvillafuertem
Copy link

@kaichao I can only use the nginx image due to company policy, any idea how to get the same result without changing the image?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment