2013-07-12 6 views
18

Próbuję zalogować treść POST i dodać $request_body do klauzuli log_format w http, ale komenda access_log po prostu wypisuje "-" jako treść po I wysłać żądanie POST przy użyciu:Naprawdę rejestrowanie treści żądania POST (zamiast "-") przy użyciu nginx

curl -d name=xxxx myip/my_location 

Moje log_format (w http klauzuli):

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

moja definicja lokalizacji (w klauzuli serwera):

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

Jak mogę wydrukować rzeczywiste dane POST z zawinięcia?

+0

brzmi jak tych facetów znalazł rozwiązanie: http://stackoverflow.com/questions/4939382/logging-post-data-from-request-body – aet

Odpowiedz

41

Nginx nie analizuje treści żądania klienta, chyba że naprawdę tego potrzebuje, więc zwykle nie wypełnia zmiennej $request_body.

Wyjątkami są, gdy:

  • wysyła żądanie do serwera proxy,
  • lub serwera fastcgi.

Naprawdę musisz dodać dyrektywy proxy_pass lub fastcgi_pass do swojego bloku.

Najprostszym sposobem jest wysłanie go do nginx się jako serwer proxy, na przykład z tej konfiguracji:

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

Jeśli tylko oczekiwać, aby otrzymać pewne wartości key-pair, to może być dobry pomysł ograniczenie wielkości prośba ciała:

client_max_body_size 1k; 
client_body_buffer_size 1k; 
client_body_in_single_buffer on; 

przejąłem „405 Not Allowed” błędy podczas testów prowadzonych empty_gif; i zwijania (było ok z przeglądarki), przeszedłem ją return 200; prawidłowo przetestować z dyni.

+0

Próbowałem za to samo, ale w moich dziennikach nginx Nadal znajduję request_body, aby było puste. – Abhi

+0

Chcę zalogować "treść odpowiedzi", która jest json, do dziennika nginx. przykład: http: // /prod/get_sources daje mi JSON zawierający listę źródeł. Jak mogę zalogować to w dzienniku nginx. – Abhi

+0

Nie, ta metoda nie może być używana do rejestrowania danych wyjściowych aplikacji, tylko dane wejściowe, które otrzymuje, takie jak żądanie REST, używając PUT/POST jako wartości json, nawet z kodowanych łańcuchów. Możesz jednak przesłać dane ze swojej aplikacji do nginx za pomocą dziennika błędów. –