2013-07-12 7 views
18

Sto tentando di registrare il corpo POST e aggiungere $request_body alla clausola log_format nella clausola http, ma il comando access_log stampa solo "-" come il corpo dopo mando richiesta POST utilizzando:Really logging del corpo della richiesta POST (invece di "-") con nginx

curl -d name=xxxx myip/my_location 

mio log_format (in http clausola):

log_format client '$remote_addr - $remote_user $request_time $upstream_response_time ' 
        '[$time_local] "$request" $status $body_bytes_sent $request_body "$http_referer" ' 
        '"$http_user_agent" "$http_x_forwarded_for"'; 

La mia posizione definizione (nella clausola server):

location = /c.gif { 
    empty_gif; 
    access_log logs/uaa_access.log client; 
} 

Come posso stampare i dati POST effettivi dall'arricciatura?

+0

Suoni come questi ragazzi hanno trovato una soluzione: http://stackoverflow.com/questions/4939382/logging-post-data-from-request-body – aet

risposta

41

Nginx non analizza il corpo della richiesta del client a meno che non ne abbia realmente bisogno, quindi di solito non riempie la variabile $request_body.

Le eccezioni sono quando:

  • si invia la richiesta a un proxy,
  • o un server FastCGI.

Quindi è davvero necessario aggiungere le direttive proxy_pass o fastcgi_pass al blocco.

Il modo più semplice è quello di inviare a Nginx se stesso come un server Proxied, ad esempio, con questa configurazione:

location = /c.gif { 
    access_log logs/uaa_access.log client; 
    # add the proper port or IP address if Nginx is not on 127.0.0.1:80 
    proxy_pass http://127.0.0.1/post_gif; 
} 
location = /post_gif { 
    # turn off logging here to avoid double logging 
    access_log off; 
    empty_gif; 
} 

Se si prevede di ricevere alcuni valori-coppia di chiavi, potrebbe essere una buona idea per limitare la dimensione richiesta corpo:

client_max_body_size 1k; 
client_body_buffer_size 1k; 
client_body_in_single_buffer on; 

anch'io ho ricevuto "405 non consentito" errori quando test utilizzando empty_gif; e ricciolo (era ok dal browser), sono passato a return 200; per testare correttamente con ricciolo.

+0

Ho provato ad utilizzare lo stesso, ma nei miei ceppi nginx Trovo ancora che request_body sia vuoto. – Abhi

+0

Voglio registrare il "contenuto della risposta" che è un json, nel registro nginx. esempio: http: // /prod/get_sources mi fornisce l'elenco di sorgenti JSON contenente. Come posso registrarlo nel log di nginx. – Abhi

+0

No, questo metodo non può essere utilizzato per registrare l'output della propria applicazione, solo l'input che riceve, come una richiesta REST che utilizza PUT/POST come valori json, anche stringhe codificate. È possibile inoltrare i dati dall'applicazione a nginx utilizzando il registro degli errori. –

Problemi correlati