「Apacheのログの一部を残したくない!」
「このログは別のログファイルに記憶したい!」
なんてことありますよね。
そんな時はApacheのログを綺麗に振り分けてしまいましょう!
実践
まず、ApacheはCustomLogディレクティブを記述することで管理者が任意にログの出力先や形式を指定することが出来るようになっています。
いきなりですが、/etc/httpd/conf.d/virtual.confに以下の記述があったとしましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<VirtualHost *:80> ServerName blog.ryzen.tokyo ServerAdmin webmaster@jdbc.tokyo DocumentRoot /var/www/html ErrorLog /var/log/httpd/www-error_log SetEnvIf Request_Method "PROPFIND" no_log SetEnvIf Request_URI "\.(gif|jpg|jpeg|png)$" no_log SetEnvIf Request_URI "/service" service_log no_log CustomLog /var/log/httpd/service-access_log combined env=service_log CustomLog /var/log/httpd/www-access_log combined env=!no_log <Directory "/var/www/html"> Options Includes ExecCGI FollowSymLinks AllowOverride All <RequireAll> Require all granted </RequireAll> </Directory> </VirtualHost> |
わかりやすいようにVirtualHostの設定例を全体載せましたが、実際に注目していただきたいのは以下の部分です。
1 2 3 4 5 6 |
ErrorLog /var/log/httpd/www-error_log SetEnvIf Request_Method "PROPFIND" no_log SetEnvIf Request_URI "\.(gif|jpg|jpeg|png)$" no_log SetEnvIf Request_URI "/service" service_log no_log CustomLog /var/log/httpd/service-access_log combined env=service_log CustomLog /var/log/httpd/www-access_log combined env=!no_log |
最初のErrorLogはErrorLogの出力先ファイル名を表します。
次のSetEnvIfディレクティブが肝になります。
このディレクティブは環境変数を設定することが出来るもので、
“SetEnvIf リクエストの種類 具体的なリクエストの属性 環境変数名”
という記述をします。
今回は、
no_log変数にはログを取りたくない物の定義を
service_logには別のログファイルに分けたい物の定義を行っていきます。
環境変数に定義している部分を一つづつ解説します。
1 |
SetEnvIf Request_Method "PROPFIND" no_log |
Request_MethodがPROFINDという内容をno_logという変数にセットしています。
リクエストメソッドによる定義が可能になる指定で、PROFINDではなくGETやPOST等も、もちろん設定可能です。
1 |
SetEnvIf Request_URI "\.(gif|jpg|jpeg|png)$" no_log |
Request_URIの末尾が.gif .jpg .jpeg .pngに該当するものを設定しています。
リクエストURIを指定することが可能で、画像ファイルへのアクセスはログに残したくない。などの目的で使えます。
あ、ここで書いているように正規表現が使えます。
1 |
SetEnvIf Request_URI "/service" service_log no_log |
同じくRequest_URIを定義しています。
/service以下のディレクトリへのアクセスを指定していますが、設定したい環境変数を上記のようにつなげて書くこともできます。
この3つの指定でそれぞれの環境変数の中身は以下のようになりました。
no_log | Request_Method “PROFIND” Request_URI “\.(gif|jpg|jpeg|png)$” Request_URI “/service” |
service_log | Request_URI “/service” |
そして最後のCustomLogディレクティブで、適切なログファイルへの設定を行います。
1 |
CustomLog /var/log/httpd/service-access_log combined env=service_log |
/var/log/httpd/service-access_logというファイルにservice_log変数に設定されているものを出力してください。
という意味になります。
なので、上記ログには/service以下へのアクセスのみ記録されていきます。
1 |
CustomLog /var/log/httpd/www-access_log combined env=!no_log |
/var/log/httpd/www-access_logというファイルにno_logに設定されている物以外を出力してください。
という意味になります。エクスクラメーションマークは否定(~以外)の意味になります。
なので、上記ログにはリクエストメソッドがPROFIND・リクエストURIがgifなど画像ファイルでない・/serviceディレクトリ以下へのアクセスでない物が記録されていくのです。
このようにすればログを振り分けていくことが可能です!
ちなみにcombinedというのはログをどの程度の精度で出力するかの指定なのですが、combined以外のログ形式は正直使い物にならないのでcombinedにしておいてください。
SetEnvIfディレクティブを詳しく
SetEnvIfディレクティブはRequestMethodとRequest_URI以外にも色々なリクエストの内容を扱うことができます。
Remote_Host | リクエスト元のクライアントのホスト名 |
Remote_Addr | リクエスト元のクライアントのIPアドレス |
Server_Addr | リクエストを受け取ったサーバのIPアドレス |
Request_Method | リクエストメソッド名(GET,POST等…) |
Request_Protocol | リクエストのプロトコル(”HTTP/1.1″等…) |
Request_URI | URLスキームとホストの後の部分 |
こんな感じでHTTPリクエストが来た情報によって色々振り分けが可能なので、参考になれば幸いです。
Apache2.2の公式Docはこちらです。