1. ホーム
  2. logging

[解決済み] POST データを $request_body からログに記録する

2023-07-17 20:33:41

質問

私は、分析を処理し、ログのためのクエリ文字列を解析するために正常に動作するピクセルをレンダリングする多くの GET リクエストを処理するように自分の構成を設定しています。追加のサードパーティのデータストリームで、私はリクエストボディの中に期待されるロギング可能なフォーマットのJSONを持つ特定のURLへのPOSTリクエストを処理する必要があります。私は、セカンダリサーバで proxy_pass でセカンダリサーバを使いたくないし、GETリクエストで行うように、関連するログファイルに応答全体を記録したいだけなのです。私が使用しているいくつかのコードのスニペットは、次のようになります。

GETリクエスト(これは素晴らしく機能します)。

location ^~ /rl.gif {
  set $rl_lcid $arg_lcid;
  if ($http_cookie ~* "lcid=(.*\S)")
  {
    set $rl_lcid $cookie_lcid;
  }
  empty_gif;
  log_format my_tracking '{ "guid" : "$rl_lcid", "data" : "$arg__rlcdnsegs" }';
  access_log  /mnt/logs/nginx/my.access.log my_tracking;
  rewrite ^(.*)$ http://my/url?id=$cookie_lcid? redirect;
}

私がやろうとしていることは、なんとなくこんな感じです。 POSTリクエスト(これは動作しません)。

location /bk {
  log_format bk_tracking $request_body;
  access_log  /mnt/logs/nginx/bk.access.log bk_tracking;
}

カーリング curl http://myurl/bk -d name=example をクリックすると、404ページが見つかりませんと表示されます。

それから、私は試してみました。

location /bk.gif {
  empty_gif;
  log_format bk_tracking $request_body;
  access_log  /mnt/logs/nginx/bk.access.log bk_tracking;
}

カーリング curl http://myurl/bk.gif -d name=example405 Not Allowed .

私の現在のバージョンは nginx/0.7.62 . 正しい方向へのどんな助けでも非常に感謝します! ありがとうございます!

アップデイト ということで、今の私の投稿はこんな感じです。

location /bk {
  if ($request_method != POST) {
    return 405;
  }
  proxy_pass $scheme://127.0.0.1:$server_port/dummy;
  log_format my_tracking $request_body;
  access_log  /mnt/logs/nginx/my.access.log my_tracking;
}
location /dummy { set $test 0; }

これは投稿データを正しく記録していますが、リクエスト側では404を返します。もし私が上記のコードを変更して、以下のように200を返すようにしたら。

location /bk {
  if ($request_method != POST) {
    return 405;
  }
  proxy_pass $scheme://127.0.0.1:$server_port/dummy;
  log_format my_tracking $request_body;
  access_log  /mnt/logs/nginx/my.access.log my_tracking;
  return 200;
}
location /dummy { set $test 0; }

そして 200 を正しく返しますが、投稿データは記録されなくなります。

その他の更新 ちょっとだけ、動作する解決策を見つけました。うまくいけば、これが他の人の助けになります。

どのように解決するのですか?

この解決策は魅力的に機能します(2017年に更新され、log_formatがnginx設定のhttp部分に必要であることを尊重するようになりました)。

log_format postdata $request_body;

server {
    # (...)

    location = /post.php {
       access_log  /var/log/nginx/postdata.log  postdata;
       fastcgi_pass php_cgi;
    }
}

nginxにcgiスクリプトを呼び出すと思わせるのがコツだと思います。