web-dev-qa-db-ja.com

特定のリクエストのみのための個別のNginxアクセスログファイル

私が見る限り、Nginxはデフォルトで2つのログファイルをサポートしています:error_log(Nginxサーバー自体に関連する問題を追跡)とaccess_log(Nginxによって処理されたリクエストを追跡)。 access_log ディレクティブを使用してlog_formatの形式を制御することは可能ですが、特定の要求のみを別のファイルに記録する方法を見つけることに失敗しました。将来の読者のためのリファレンスとしてSFに関する質問をしたいと思います。

access_logで定義されたものとは異なるログファイルに特定のリクエストを記録する方法はありますか?

この質問の背後にある理由は、不要なクローラーへのアクセスを200で拒否するルールがあり(403はそれらがブロックされているというヒントを与えるため)、これらのリクエストをaccess_logから除外するためですより困難。

7
Max

cjc私を正しい軌道に乗せてください。 ifステートメントでaccess_logを単独で使用することはできません(nginx: [emerg] "access_log" directive is not allowed hereエラーが発生します)。したがって、回避策は次のとおりです。

if ($http_user_agent ~* (crawler) ) {
  set $crawler 'yes';
}
location ~ .* {
  if ($crawler = 'yes') {
    access_log /var/log/nginx/blockedbots.log;
    return 200;
    }
}
8
Max

access_logは次の場合にサポートします:

(access_log path [format [buffer = size [flush = time]] [if = condition]];)

access_log /var/.... if $crawler;

ソース:

http://nginx.org/en/docs/http/ngx_http_log_module.html

5
Thomas Decaux

ドキュメントによると、ifブロック内にaccess_logディレクティブを配置できるはずです。

http://wiki.nginx.org/HttpLogModule

したがって、次のようなことができるはずです。

if ($http_user_agent ~* (crawler) ) {
   access_log /path/to/other/log/file ;
}
4
cjc