Skip to content

Apacheログの振り分け、除外方法

Posted in CentOS7

「Apacheのログの一部を残したくない!」
「このログは別のログファイルに記憶したい!」

なんてことありますよね。

そんな時はApacheのログを綺麗に振り分けてしまいましょう!

実践

まず、ApacheはCustomLogディレクティブを記述することで管理者が任意にログの出力先や形式を指定することが出来るようになっています。

いきなりですが、/etc/httpd/conf.d/virtual.confに以下の記述があったとしましょう。

わかりやすいようにVirtualHostの設定例を全体載せましたが、実際に注目していただきたいのは以下の部分です。

最初のErrorLogはErrorLogの出力先ファイル名を表します。

次のSetEnvIfディレクティブが肝になります。
このディレクティブは環境変数を設定することが出来るもので、

“SetEnvIf リクエストの種類 具体的なリクエストの属性 環境変数名”

という記述をします。

今回は、
no_log変数にはログを取りたくない物の定義を
service_logには別のログファイルに分けたい物の定義を行っていきます。

環境変数に定義している部分を一つづつ解説します。

Request_MethodがPROFINDという内容をno_logという変数にセットしています。
リクエストメソッドによる定義が可能になる指定で、PROFINDではなくGETやPOST等も、もちろん設定可能です。

Request_URIの末尾が.gif .jpg .jpeg .pngに該当するものを設定しています。
リクエストURIを指定することが可能で、画像ファイルへのアクセスはログに残したくない。などの目的で使えます。
あ、ここで書いているように正規表現が使えます。

同じくRequest_URIを定義しています。
/service以下のディレクトリへのアクセスを指定していますが、設定したい環境変数を上記のようにつなげて書くこともできます。

この3つの指定でそれぞれの環境変数の中身は以下のようになりました。

no_log Request_Method “PROFIND”
Request_URI “\.(gif|jpg|jpeg|png)$”
Request_URI “/service”
service_log Request_URI “/service”

そして最後のCustomLogディレクティブで、適切なログファイルへの設定を行います。

/var/log/httpd/service-access_logというファイルにservice_log変数に設定されているものを出力してください。
という意味になります。
なので、上記ログには/service以下へのアクセスのみ記録されていきます。

/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はこちらです。

Comments are closed.