OSS Fan ~OSSでLinuxサーバ構築~

作成日: 2014/05/12

Linuxサーバ管理

Apacheのアクセスログの見方

トップページLinuxサーバ管理 > Apacheのアクセスログの見方
このエントリーをはてなブックマークに追加

概要

 RHEL 5.9のインストールメディアに同梱されている Apache HTTP サーバのアクセスログ(/var/log/httpd/access_log)の 見方をまとめます。

 Apacheではサーバが受信したHTTPリクエストを1件につき1行のログとして アクセスログに記録します。見方はあまり難しくないのですが、 どの部分が何を表しているのか分かりづらいので整理します。

 なお、初期状態ではアクセスログが出力される設定になっていますが、 設定ファイル(httpd.conf)を変更することで、 出力先のファイルを指定することや、出力させないこともできます。

構成

想定環境

Apacheの設定ファイルパス
/etc/httpd/conf/httpd.conf

アクセスログのフルパス
/var/log/httpd/access_log

サーバ構成

OSバージョン

Red Hat Enterprise Linux 5.9 x86_64

ソフトウェア・パッケージ一覧

httpd-2.2.3-74.el5

Apacheのアクセスログの設定確認

設定ファイル

 Apacheの設定ファイル(/etc/httpd/conf/httpd.conf)の アクセスログに関連する設定を以下に抜き出します。

 下記設定はあくまでRHEL 5.9の初期設定の場合です。 ディストリビューションが異なる場合や、ソースコードからコンパイルして Apacheをインストールした場合などは異なる設定となっていますので 適宜読み替えてください。

ファイル名:/etc/httpd/conf/httpd.conf
※以下、関連する行のみ抜粋※
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

CustomLog logs/access_log combined

 ログフォーマットが4種類 LogFormat ディレクティブで定義されていて、 アクセスログはそのうち combined というフォーマットを選択しています。 ログのパスは ServerRoot ディレクティブで定義されたパス (RHEL5.9のApacheでは初期状態で /etc/httpd が設定されている) からの相対パスで指定されています。 つまりアクセスログのパスは /etc/httpd/logs/access_log となります。

 ただし、/etc/httpd/logs/ ディレクトリは /var/log/httpd/ ディレクトリへの シンボリックリンクとなっています。したがってアクセスログの実体パスは /var/log/httpd/access_log となります。

ログフォーマットの見方

 アクセスログに設定されている combined フォーマットのログ形式は 以下のように設定されています。

%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"

 項目を一つずつ見ていきます。

%hリモートホスト。つまりApacheにアクセスしてきたクライアントPCのIPアドレスとなります。
%lリモートログ名。mod_identモジュールがロードされており、IdentityCheckディレクティブがOnになっている場合のみ表示されます。それ以外の場合は『-』と表示されます。
%uリモートユーザ。
%tリクエストを受信した時刻。
%rリクエストの最初の行。
%>s%sはステータスコード。内部でリダイレクトされた場合でも元々のステータスコードを出力。%>sはリダイレクトされた場合最後のステータスコードを出力。
%bHTTPヘッダを除くレスポンスのバイト数。0バイトの場合は『-』と表示されます。
%{Referer}iサーバが受信したリクエストヘッダのReferer。
%{User-Agent}iサーバが受信したリクエストヘッダのUser-Agent。

アクセスログの見方

 ブラウザを利用してApacheにアクセスした際に出力されたログを1件例として表示します。

 1件のログが長いため表示の都合上2行に分けて表示していますが、 実際には1行のログです。

192.168.0.101 - - [12/May/2014:20:41:48 +0900] "GET /index.html HTTP/1.1" 200 114 "-" 
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0"

 上記ログの各項目を以下に説明します。

%h192.168.0.101
⇒ApacheにアクセスしてきたPCのIPアドレス。
%l-
%u-
%t[12/May/2014:20:41:48 +0900]
⇒HTTPリクエストを受信した時刻。
%rGET /index.html HTTP/1.1
⇒クライアントはHTTPプロトコルバージョン1.1を利用して http://ドメイン名/index.html にGETメソッドでアクセスしてきたことを表します。
%>s200
⇒HTTPステータスコード。200はレスポンスを返すことに成功したことを表します。
%b114
⇒HTTPレスポンスのサイズ(バイト数)。ただしHTTPヘッダは除きます。
%{Referer}i-
⇒当ページへアクセスするに当たり、リンクをたどってきたのではなく、直接アクセスしてきたことを表します。
%{User-Agent}iMozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0
⇒クライアントのOSはWindows NT 6.1(プロダクト名はWindows 7)で、ブラウザにFirefox 29.0を利用してアクセスしてきたことが分かります。

アクセスログの出力タイミング

 アクセスログに書かれている時刻はApacheがHTTPリクエストを受信した時刻ですが、 ログメッセージがログファイルに書かれるのはApacheがレスポンスを返すときです。

 アクセスログの表示項目を見ていれば分かりますが、HTTPレスポンスのサイズや、 今回は紹介していませんが、レスポンスを返すまでのサーバでの処理時間をログに 記載することができます。これら情報はApacheがリクエストを受け取った時点では まだ分からないので、レスポンスを返す時点で必要な情報が揃ってからまとめて ログファイルに書き出します。

 そのため、先にサーバでの処理時間が長いリクエストを受け取って、その後 処理時間が短いリクエストを受け取った場合、ログファイルを表示すると 時刻が逆転しているように見えます。 記録された時刻が間違っているわけではないのでご注意ください。

(アクセス2)192.168.0.101 - - [12/May/2014:21:14:56 +0900] "GET /index.html HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0"
(アクセス3)192.168.0.101 - - [12/May/2014:21:14:59 +0900] "GET /test.html HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0"
(アクセス1)192.168.0.101 - - [12/May/2014:21:14:51 +0900] "GET /sleep.php HTTP/1.1" 200 - "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0"

 アクセスした順はログに記載されている時刻の通りアクセス1→2→3の順ですが、 ログファイルにログメッセージが書かれるのはレスポンスを返した順なので、 アクセス2→3→1の順となっています。

関連サイト

プロフィール

らのっち

損害保険会社のIT企画部に勤務するSEです。OSSを勉強中です。

<所属>
日本PostgreSQLユーザ会とくしまOSS普及協議会

■■■ 当サイトは Internet Explorer 11 と Mozilla Firefox 43 で動作確認済みです。 ■■■