1. 程式人生 > >【nginx】App打點場景下,用nginx的log捕獲http協議的$request_body的正確方法

【nginx】App打點場景下,用nginx的log捕獲http協議的$request_body的正確方法

【應用場景】

App裡面的打點資料想自己收集,可以考慮向nginx發一個json,通過nginx生成的日誌實現實時獲取資料。

所以問題就歸結為nginx日誌的生成。

正如  http://www.cnblogs.com/meteorx/p/3188647.html 這篇作者抱怨的,nginx並不會老老實實把request_body生成在log中。不會生成的原理在於nginx處理content之前是否讀到了request_body,上文的作者給了一個很奇怪的解決方法,或許對於他來說是必須的,但是對於打點資料來說實在太複雜。

【解決方法】

簡單的解決方案就在nginx配置檔案之中。

配置檔案的server=>location當中設定成不應答請求

server{

location = /event {
                set $invalid 1;
                if ( $request_method = POST ) {
                        set $invalid 0;
                        echo_read_request_body;
                        access_log /logs/event_post.log post_format;
                }
                if ( $request_method = GET ) {
                        set $invalid 0;
                        access_log /logs/event_get.log get_format;
                        #return 200; 不要加這個,否則會導致捕獲不到request_body

                }
                if ( $invalid ) {
                        access_log /logs/event_nongetpost.log;
                        return 405;
                }
        }

}