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.


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!";
        }
    }
}

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


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.