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

我想获取所有请求和响应的细节,并考虑将它们保存到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));
    }

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

点赞
用户3449039
用户3449039

这是因为 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
2018-09-05 19:18:37
用户3073309
用户3073309
# 设置客户端请求体缓冲区大小为 5000
client_body_buffer_size 5000;
# 使用 Lua 代码块过滤响应体
body_filter_by_lua_block{
    # 截取响应体前 5000 个字符
    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)日志中记录响应。

2021-01-08 04:19:54