2013-07-12 87 views
18

我試圖登錄POST體,並在http子句添加$request_bodylog_format,但access_log命令只是打印「 - 」因爲身體後我用發送POST請求:真的記錄(而不是「 - 」)POST請求體nginx的

curl -d name=xxxx myip/my_location 

我log_format(在http條款):

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

我的位置定義(在服務器條款):

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

如何從curl打印實際POST數據?

+0

聽起來像這些傢伙找到了解決辦法: http://stackoverflow.com/questions/4939382/logging-post-data-from-request-body – aet

回答

41

Nginx不解析客戶端請求體,除非它確實需要,所以它通常不會填充$request_body變量。

的例外是當:

  • 它將請求發送到代理,
  • 或fastcgi的服務器。

因此,您確實需要將proxy_passfastcgi_pass指令添加到您的區塊。

最簡單的方法就是使用此配置發送給自己的Nginx作爲代理的服務器,例如:

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

如果你只希望獲得一定的密鑰對值,這可能是一個好主意限制請求機身尺寸:

client_max_body_size 1k; 
client_body_buffer_size 1k; 
client_body_in_single_buffer on; 

我也收到了「405不允許」錯誤使用empty_gif;和捲曲(這是從瀏覽器中確定)進行測試時,我把它切換到return 200;正確的捲曲測試。

+0

我使用同樣的嘗試,但在我nginx的日誌我仍然發現request_body是空的。 – Abhi

+0

我想記錄作爲json的「響應內容」到nginx日誌。例如:http:// /prod/get_sources給了我包含源列表的JSON。我怎樣才能將它記錄到nginx日誌中。 – Abhi

+0

不,這個方法不能用來記錄應用程序的輸出,只是它接收到的輸入,就像使用PUT/POST作爲json值的REST請求一樣,甚至形成編碼的字符串。 但是,您可以使用錯誤日誌將數據從應用程序轉發到nginx。 –