アクセスログフォーマットにまつわるよもやま話



Common Log Format

伝統的な host ident authuser date request status bytes 形式のログ出力です。

以下のような出力となります。

127.0.0.1 user-identifier frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326


Apache では httpd.conf で以下のように定義されています。

LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog logs/access_log common


Tomcatserver.xml ではデフォルトで common が使われています。

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
            prefix="localhost_access_log." suffix=".txt"
            pattern="common" />

Spring Boot でも以下がデフォルトとなります。

server.tomcat.accesslog.pattern=common # Format pattern for access logs.


通常は、これでは情報が足りないので、以下に示す combined が使われることが多いです。



Combined Log Format

Apache では httpd.conf で以下のように定義されています。

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog log/access_log combined 


common の末尾に HTTP ヘッダの Referer と User-Agent を加えた形式です。


Nginx のデフォルトは combined で以下のような定義になっています。

log_format combined '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent"';


ロードバランサ配下にWebサーバを配備した場合は、combined に加えて追加情報を出力すべきです。



カスタム Log Format

リバースプロキシの裏のWebサーバでは、host をログ出力しても、プロキシのIPアドレスが出力されてしまいます。

この場合は通常、プロキシが HTTP ヘッダに X-Forwarded-For としてクライアントアドレスを設定するので、Apache の場合以下のように定義することでクライアントアドレスをログ出力することができます。

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" proxy
SetEnvIf X-Forwarded-For "^.*\..*\..*\..*" forwarded
CustomLog "logs/access_log" combined env=!forwarded
CustomLog "logs/access_log" proxy env=forwarded


集計などはプロキシのログで行うとして、単に末尾に加えてもよいでしょう。

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{X-Forwarded-For}i" main


Nginx の場合は以下のようになります。

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
              '$status $body_bytes_sent "$http_referer" '
              '"$http_user_agent" "$http_x_forwarded_for"';


アプリケーションサーバの場合はさらに付加情報を出しておくと便利です。

Tomcat の場合は(&quot;によるエスケープで見にくいですが )以下のようになります。

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
            prefix="localhost_access_log." suffix=".txt"
            pattern="%h %l %u %t &quot;%r&quot; %s %b &quot;%{Referer}i&quot; &quot;%{User-Agent}i&quot; %{X-Forwarded-For}i %D %S %I" />


フォーマット文字 説明
%h リモートホスト
%l リモートログ名
%u リモートユーザ
%t 日時
%r リクエストメソッド
%s HTTPステータスコード
%b レスポンスサイズ(byte)
"%{Referer}i" リファラー(HTTPヘッダ)
"%{User-Agent}i" ユーザエージェント(HTTPヘッダ)
%{X-Forwarded-For}i X-Forwarded-For(HTTPヘッダ)
%D 処理時間(msec)
%S セッションID
%I スレッド名


その他は以下のリファレンスを参照してください。

tomcat.apache.org


Spring Boot で Tomcat 使う場合は以下のようになります。

server.tomcat.accesslog.pattern='%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i" %{X-Forwarded-For}i %D %S %I'