응답 데이터를 nginx 액세스 로그에 기록 할 수 있습니까?


13

개발 / 디버깅 목적으로 응답 데이터를 인쇄하려고합니다. 비슷한 질문이나 이에 대한 정보를 찾을 수 없습니다. 그렇다면 의견을 추가하십시오.



1
아니요. 요청 본문이지만 응답 본문을 뱉고 싶습니다. 감사.
vamsu

답변:


11

body_filter_by_lua요청 본문을 nginx 변수에 할당하는 데 사용 합니다. 예는 다음과 같습니다.

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
코드에서 응답 청크에서 첫 1000 바이트를 넣고 resp_body, 즉 "resp_body = string.sub (ngx.arg [1], 1, 1000)"행에 넣는 것 같습니다. 1000이되는 특별한 이유가 있습니까?
doon

제 경우에는 응답 본문을 제공하지 않지만 다음과 같은 로그 경로를 제공합니다. "resp_body :" "access_log / usr / local / openresty / nginx / logs / access.logupstreamlog"무엇이 잘못 되었습니까?
SMT

3

ngx_lua 모듈 사용

이처럼

body_filter_by_lua 'ngx.log(ngx.CRIT,ngx.arg[1])';

오른쪽에서 location


1
사용하는 것을 선호한다고 생각합니다 ngx.DEBUG. CRIT는 등 ..., 전체 시스템 관리자 팀에 이메일, 콘솔에 인쇄되는 수
마이클 햄프 턴

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.