Est-il possible de consigner les données de réponse dans le journal d'accès nginx?

13

J'essaie d'imprimer les données de réponse à des fins de développement / débogage. Je n'ai pas pu trouver une question similaire ou des informations à ce sujet. Si vous le faites, veuillez ajouter un commentaire.

vamsu
la source
Voulez-vous dire quelque chose comme ça? stackoverflow.com/questions/4939382/…
Taylor Jasko
1
Non, c'est le corps de la demande, mais je veux cracher le corps de la réponse. Merci.
vamsu

Réponses:

11

Utilisez body_filter_by_luapour affecter le corps de la requête à une variable nginx, voici un exemple:

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
la source
1
Dans le code, nous semblons mettre les 1000 premiers octets du bloc de réponse et les mettre dans resp_body, c'est-à-dire dans cette ligne "resp_body = string.sub (ngx.arg [1], 1, 1000)". Y a-t-il une raison spécifique pour que ce soit 1000.
doon
Dans mon cas, il ne me donne pas de corps de réponse mais me donne le chemin du journal comme celui-ci "resp_body:" "access_log / usr / local / openresty / nginx / logs / access.logupstreamlog" Pouvez-vous s'il vous plaît suggérer ce qui ne va pas?
SMT
3

utiliser le module ngx_lua

comme ça

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

dans le droit location

Yuri
la source
1
Je pense que je préfère utiliser ngx.DEBUG. CRIT pourrait être imprimé sur la console, envoyé par e-mail à toute l'équipe sysadmin, etc ...
Michael Hampton
0

J'ai trouvé celui-ci par exemple , et je pense que le module d'écho peut également le faire.

petermolnar
la source
2
Le module d'écho et l'exemple fourni parlent de la journalisation des en-têtes / corps de demande mais je veux journaliser le corps de réponse. Merci petermolanar.
vamsu