BIG-IPでHTTPのアクセスログを取得する


まえがき

はじめに

このページでは、BIG-IPでHTTPやHTTPSの、アクセスログを取るための方法について記載してます。

たとえば、BIG-IPからSyslogサーバに、こんな感じのログを出力できます。

Nov 12 13:21:34 bigip1 Virtual=/Common/test-vs PoolMember=10.0.0.10 Response: 203.0.113.10 - - [11/Nov/2017:20:21:34 -0800] "GET /index.html HTTP/1.1" 200 97 "-" "curl/7.48.0" "-"
Nov 12 13:21:36 bigip1 Virtual=/Common/test-vs PoolMember=10.0.0.11 Response: 203.0.113.10 - - [11/Nov/2017:20:21:36 -0800] "GET /hoge.html HTTP/1.1" 404 345 "-" "curl/7.48.0" "-"

かつてのBIG-IP

一般的には「HTTPの負荷分散をしてるんだから、アクセスログを取るくらい簡単でしょ?」と思われるかもしれませんが、実は、古いバージョンのBIG-IPでは、標準的には、ログを取る機能は備わっていません。そのため、BIG-IPでHTTPアクセスログを取るには、下記ページで紹介されているようなiRuleを利用する必要がありました。

DevCentral:HTTP通信のトラブルシューティングに役に立つiRule

しかもこのログはBIG-IPの内部ハードディスクに書き込まれるため、BIG-IP自身のパフォーマンスへの影響が大きく「あくまでトラブルシュート用」と注意しなければならないものでした。

最近のBIG-IP

最近になって、Request Logging Profile という機能が実装され、iRuleを使わずともHTTP アクセスログを取得できるようになりました。
また、High Speed Logging(HSL)によってBIG-IP内部にはログを保存せずに外部サーバにログを送信することで、利用してもパフォーマンスが下がらないようになっています。

このページでは、Request Logging Profileを使った、HTTPアクセスログ取得方法を紹介します。(HTTPSの場合も変わりありません。)

設定方法

構成

以下のようなシンプルな構成を例に、設定方法について説明します。

  • Virtual Serverや、負荷分散用のPoolは、予め設定が完了しているものとします。
  • BIG-IPが、Virtual Server(203.0.133.100:80)のアクセスログを、Syslog Server(10.0.0.13)へ送信することを目的とします。

設定の要素

(1) Syslog用Pool

ログの送信先となるSyslogサーバは、Poolとして登録する必要があります。

(2) Request Logging Profile

このプロファイルに、HTTPアクセスログのフォーマットや、送信先のサーバ(Pool)や、送信時のプロトコルなどを設定します。

(3) Virtual Server

HTTPアクセスログを取得したいVirtual Serverに、Request Logging Profileを適用します。

※ Virtual Serverの注意事項

  • Request Logging Profileを適用するVirtual SereverのTypeはStanardであること。TypeがStandardではないVirtual Serverへは、Profileを適用できません。
  • HTTPの情報を取得するには、HTTP Profileの適用も必要です。HTTPプロファイルなしでも適用はでき(てしまい)ますが、その場合、HTTPヘッダ内の情報がロギングされません。

設定手順

(1) Syslog用Poolの作成

Syslog用のPoolを作成し、Pool memberとしてSyslog Serverを登録します。

(tmos)# list ltm pool syslog-pool 
ltm pool syslog-pool {
    members {
        10.0.0.13:514 {
            address 10.0.0.13
        }
    }
}

(2) Request Logging Profileの作成

新規にRequest Logging Profileを作成します。Request Logging Profile内では、以下の設定箇所を変更します。

  • Request Logging / Response Logging
    • HTTPリクエストとHTTPレスポンスの、どちらのアクセスのログ取得を行うかの設定です。Response Loggingを使うと、HTTPリクエストの情報とレスポンスの情報が両方とも取得できます。
  • Template
    • アクセスログのフォーマットを指定します。空欄だとログが出力されません。フォーマットの詳細は後で記載しています。
  • HSL Protocol
    • ログサーバに送信する際のプロトコルです。TCPかUDPのどちらかを選択します。
  • Pool Name
    • ログを送信する宛先となるサーバをPoolで指定します。ここで先ほど作成したPoolを選択します。
(tmos)# list ltm profile request-log test-req-log 
ltm profile request-log test-req-log {
    app-service none
    defaults-from request-log
    response-log-pool syslog-pool
    response-log-protocol mds-udp
    response-log-template "$BIGIP_HOSTNAME Virtual=$VIRTUAL_NAME PoolMember=$SERVER_IP Response: $NCSA_COMBINED"
    response-logging enabled
}

(3) Request Logging Profileの適用

Virtual Serverに、Request Logging Profileを適用します。

(tmos)# list ltm virtual test-vs 
ltm virtual test-vs {
    destination 203.0.113.100:http
    ip-protocol tcp
    mask 255.255.255.255
    pool test-pool
    profiles {
        http { }
        tcp { }
        test-req-log { }
    }
    source 0.0.0.0/0
    translate-address enabled
    translate-port enabled
    vs-index 19
}

これで、Virtual Serverにアクセスすれば、アクセスログが指定のSyslogサーバへ出力されます。

ログのフォーマット(Template)について

Request Logging ProfileのTemplate設定で、アクセスログのフォーマットを指定できます。デフォルト値というものはないので、きちんとフォーマットを決めなければなりません。

Apacheやnginxと同様、Templateには、アクセスを記録するための、様々な変数を使用できます。例えば「\$CLIENT_IP」という変数で、クライアント(送信元)のIPアドレスが取得できます。HTTPリクエストの先頭行の情報(メソッド、URI、HTTPバージョン)を取得したい場合は「\$HTTP_REQUEST」で取得できます。

BIG-IPで特徴的なものとしては、「VIRTUAL_NAME(Virtual Serverの名前)」、「VIRTUAL_IP(Virtual ServerのIPアドレス)」、「SERVER_IP(振り分け先Pool Memberのアドレス)」などがあります。

変数のリストは、下記マニュアルに載っていますので、そちらを参照してください。

Manual:External Monitoring of BIG-IP Systems: Implementations | Configuring Request Logging

ちなみに、いちいちTemplateを指定するのが面倒だ、という場合「\$NCSA_COMMON」と指定すると、伝統的なNCSAのログフォーマットが設定されます。これは、Templateに次の一行を指定したことと同じになります。

"\$CLIENT_IP - - \$DATE_NCSA \$HTTP_REQUEST \$HTTP_STATCODE \$RESPONSE_SIZE"

さらに「\$NCSA_COMBINED」は、以下のフォーマットをまとめたものとなっています。

"\$NCSA_COMMON \$Referer \${User-agent} \$Cookie"

免責事項

本ページの内容に誤り等があり、参考にされた方がなんらかの損害を被った場合、一切の責任は負いません。