¿Es posible registrar los datos de respuesta en el registro de acceso nginx?

13

Estoy tratando de imprimir los datos de respuesta para fines de desarrollo / depuración. No pude encontrar una pregunta similar ni ninguna información sobre esto. Si lo hace, agregue un comentario.

vamsu
fuente
¿Te refieres a algo como esto? stackoverflow.com/questions/4939382/…
Taylor Jasko
1
No. Ese es el cuerpo de la solicitud, pero quiero escupir el cuerpo de la respuesta. Gracias.
vamsu

Respuestas:

11

Use body_filter_by_luapara asignar el cuerpo de la solicitud a una variable nginx, aquí hay un ejemplo:

worker_processes  1;
error_log logs/error.log;
events {
    worker_connections 1024;
}
http {
    log_format log_req_resp '$remote_addr - $remote_user [$time_local] '
        '"$request" $status $body_bytes_sent '
        '"$http_referer" "$http_user_agent" $request_time req_body:"$request_body" resp_body:"$resp_body"';

    server {
        listen 8082;
        access_log logs/access.log log_req_resp;

        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
        ';

        location / {
            echo "Hello World!";
        }
    }
}
lyon
fuente
1
En el código, parece que ponemos los primeros 1000 bytes del fragmento de respuesta y lo ponemos en resp_body, es decir, en esta línea "resp_body = string.sub (ngx.arg [1], 1, 1000)". ¿Hay alguna razón específica para que esto sea 1000?
doon
En mi caso, no me da un cuerpo de respuesta, pero me da la ruta de acceso de registro como este "resp_body:" "access_log / usr / local / openresty / nginx / logs / access.logupstreamlog" ¿Puede sugerir qué está mal?
SMT
3

use el módulo ngx_lua

Me gusta esto

body_filter_by_lua 'ngx.log(ngx.CRIT,ngx.arg[1])';

en lo correcto location

Yuri
fuente
1
Creo que preferiría usar ngx.DEBUG. CRIT podría imprimirse en la consola, enviarse por correo electrónico a todo el equipo del administrador del sistema, etc.
Michael Hampton
0

He encontrado este, por ejemplo , y creo que el módulo de eco también puede hacerlo.

petermolnar
fuente
2
El módulo echo y el ejemplo proporcionado hablan sobre el registro de los encabezados / cuerpo de la solicitud, pero quiero registrar el cuerpo de la respuesta. Gracias petermolanar.
vamsu