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

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

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

```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](https://devcentral.f5.com/articles/http%E9%80%9A%E4%BF%A1%E3%81%AE%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AB%E5%BD%B9%E3%81%AB%E7%AB%8B%E3%81%A4irule)

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

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

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

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

![request_logging_1(1).png](https://qiita-image-store.s3.amazonaws.com/0/157891/1b0f5290-44c5-7f98-493e-704140912854.png)

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

##設定の要素
### (1) Syslog用Pool
ログの送信先となるSyslogサーバは、Poolとして登録する必要があります。

![request_logging_2.png](https://qiita-image-store.s3.amazonaws.com/0/157891/02e77cb8-6886-93ad-d48f-f0fa76b478df.png)


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

![request_logging_3.png](https://qiita-image-store.s3.amazonaws.com/0/157891/2b4358db-4a06-c95c-2bc6-7ffb9d795794.png)

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

![request_logging_4.png](https://qiita-image-store.s3.amazonaws.com/0/157891/c2e865ff-769e-93ae-1c6c-c8d4ff42c0bd.png)

※ 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を登録します。

```bash
(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を選択します。

```bash
(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を適用します。

```bash
(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](https://support.f5.com/kb/en-us/products/big-ip_ltm/manuals/product/bigip-external-monitoring-implementations-12-0-0/3.html)

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

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

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

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


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