如何将整个响应数据保存到Nginx error.log?

时间:2018-07-24 07:30:53

标签: nginx lua openresty

我想获取所有请求和响应详细信息,并且正在考虑将它们保存到ngx.log。

我使用这样的代码保存它们,我想从响应正文中获取5000个字符的长度,但是在error.log文件中,它只为每个响应保存了一部分响应数据,这要短得多超过5000。

body_filter_by_lua_block
    {
    local resp_body = string.sub(ngx.arg[1], 1, 5000)
        ngx.ctx.buffered = (ngx.ctx.buffered or "") .. resp_body
        if ngx.arg[2] then
            ngx.var.resp_body = ngx.ctx.buffered
        end
    }
log_by_lua_block{
        local data = {response={}, request={}}

        local req = ngx.req.get_headers()
        req.accessTime = os.date("%Y-%m-%d %H:%M:%S")
        data.request = req

        local resp = data.response
        resp.headers = ngx.resp.get_headers()
        resp.status = ngx.status
        resp.duration = ngx.var.upstream_response_time
        resp.body = ngx.var.resp_body

        ngx.log(ngx.NOTICE,"from log pharse:", json.encode(data));    
    }

请帮助我解释一下,以及如何更改任何配置以保存整个响应数据。或任何其他更适合保存请求和响应详细信息的建议。 谢谢!

2 个答案:

答案 0 :(得分:1)

这是因为ngx.arg [1]只是一小部分数据,您必须将字符串长度与缓冲区进行比较,如下所示:

ngx.ctx.buffered = (ngx.ctx.buffered or "") .. ngx.arg[1]
if ngx.arg[2] then
    ngx.var.resp_body = string.sub(ngx.ctx.buffered, 1, 5000)
end

答案 1 :(得分:0)

#client_body_buffer_size 5000;
  body_filter_by_lua_block{
        local resp_body = string.sub(ngx.arg[1], 1, 5000)
        ngx.ctx.buffered = (ngx.ctx.buffered or "") .. resp_body
        if ngx.arg[2] then
            ngx.log(ngx.INFO, ngx.ctx.buffered)
        end
  }

我已经更改了一些,我使用上面的方法在 nginx(openresty) 日志中记录响应