2013-07-12 4 views
18

POST 본문을 로깅하려고 시도하고 http 절의 log_format$request_body을 추가하려고합니다. 그러나 access_log 명령은 "-"을 본문으로 인쇄합니다. (http 절에)실제로 nginx로 POST 요청 본문을 로깅합니다.

curl -d name=xxxx myip/my_location 

내 log_format을 : 내가 사용하여 POST 요청을 보낼

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

어떻게하면 실제 POST 데이터를 인쇄 할 수 있습니까?

+0

사운드는 해결책을 발견 : http://stackoverflow.com/questions/4939382/logging-post-data-from-request-body – aet

답변

41

Nginx는 실제로 필요하지 않는 한 클라이언트 요청 본문을 구문 분석하지 않으므로 일반적으로 $request_body 변수를 채우지 않습니다.

  • 는 프록시에 대한 요청,
  • 또는 FastCGI를 서버에 전송합니다

    예외는 때입니다.

proxy_pass 또는 fastcgi_pass 지시어를 블록에 추가해야합니다. 그것은 좋은 생각이 될 수도, 당신은 단지 몇 가지 키 쌍의 값을 받게 될 경우

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

:

가장 쉬운 방법은이 구성 예를 들어, 프록시 서버로 자신을 Nginx에 그것을 보내는 것입니다 요청 본문 크기 제한 :

client_max_body_size 1k; 
client_body_buffer_size 1k; 
client_body_in_single_buffer on; 

가 나는 또한 접수를 empty_gif;과 컬을 (가 브라우저에서 확인했다)를 사용하여 테스트 "405 금지됨"오류, 내가 제대로 말리지 테스트 return 200;에 투입합니다. 이 녀석 같은

+0

내가 같은를 사용하여 시도,하지만 내 nginx를 로그에 나는 여전히 request_body가 비어 있음을 알았다. – Abhi

+0

json 인 "응답 내용"을 nginx 로그에 기록하고 싶습니다. 예 : http : // /prod/get_sources는 JSON에 소스 목록을 제공합니다. 이것을 nginx 로그에 어떻게 기록 할 수 있습니까? – Abhi

+0

아니요,이 메서드는 응용 프로그램의 출력을 기록하는 데 사용할 수 없습니다. PUT/POST를 json 값으로 사용하는 REST 요청과 같이 인코딩 된 문자열을 작성하는 것처럼 입력을받습니다. 오류 로그를 사용하여 애플리케이션의 데이터를 nginx로 전달할 수 있습니다. –

관련 문제