Fastly  Log Streaming

# Fastly ログ
Fastly ログの特徴はリアルタイムにログの配信が可能な点です。Fastly CDN へのアクセスがあるとほぼ同時に設定したログをサポートしているさまざまなログサーバに配信することができます。
ただし、AWS S3 や Google Cloud Storage(GCS) などでは指定した期間経過後に作成されたファイルがクローズされ、中身が見られるようになるため、その点は注意が必要です。

# ログ設定の流れ

1. ログサーバの設定
出力先によって設定はさまざまですが、受け取り側の設定が必要となります。特に権限設定が必要な AWS S3 や GCS などは IAM (Identity and Access Management) の設定を正しくしておくことが重要です。

2. 取得項目の決定
Fastly のログの設定のフォームは apache 互換となっています。それ以外に Fastly 独自の変数もログ出力が可能となっています。詳細は [Custom Log Formats](https://docs.fastly.com/guides/streaming-logs/custom-log-formats) を参照してください。ログの分析目的に応じてログの取得項目を決定します。

3. ログの出力タイミングを決定
ログは基本的にはコンテンツを配信するタイミングで出力しますが、リクエストを受信したタイミングやオリジンからレスポンスが帰ってきたタイミングなどで出力することも可能です。どこで出力するかを決定します。

4. フォーマットを決定
ログをさらに他のシステムに取り込んで分析したいとった場合には、それに応じたフォーマットでの出力が必要になってきます。プリフィックスの設定やファイル名、区切り文字などを決定します。

5. ログの設定
上記で決定した内容に沿ってログの設定を行います。設定は基本的には GUI で行います。ただし、ログの出力場所やフォーマットによってはカスタム VCL や API を用いることがあります。

6. 出力の確認
実際にリクエストを投げて、想定通りのログが出力されることを確認します。

## ログサーバの設定
Fastly ログの出力のために特殊設定が必要ではないため割愛しますが、S3 や GCS の設定についてはステップも多いため、[FastlyのログをS3に保存する](http://qiita.com/Satoshi-Ishii/items/1ec701a5d823807a3a78)や[Fastly のログを BigQuery に取り込んでみる](http://qiita.com/Satoshi-Ishii/items/1f8b6ee09829c092658b)で紹介しています。

## 取得項目の決定
apache の common として設定されているのが `%h %l %u %t "%r" %>s %b` で、ログ設定のデフォルトでも用いられています。下記のような出力が得られます。

```
123.456.78.9 "-" "-" [03/Mar/2017:14:41:42 +0000] "GET /index.html HTTP/1.1" 200 121
```

ただ、実際に CDN として利用する場合には、キャッシュの MISS/HIT やクライアントのアクセス元などその他の情報を取得したいケースがあります。Fastly で利用可能な各種変数は <font color="Red">%{変数}V</font> で取得が可能です。
例えば、`%{fastly_info.state}V %{geoip.country_code}V` を加えるとキャッシュの状態とリクエスト元の国コードを取得することができます。

```
123.456.78.9 "-" "-" [03/Mar/2017:14:59:18 +0000] "GET /index.html HTTP/1.1" 200 121 HIT-CLUSTER JP
```

## ログの出力タイミングを決定
クライアントへのレスポンス時に出力するのが一般的です。ただ、リクエストを受信したときに出力したいなども可能です。その場合にはカスタム VCL を利用し、コードを追加します。`vcl_log` のコードがオリジナルのコードなので、vcl_recv などで利用する場合には、vcl_log のコードをコピーして出力項目を修正して追加します。
コード内の `return(xxx)` の後にコードを追加すると出力されないので注意が必要です。

```
sub vcl_recv {
  ...
  log {"syslog 1234 fastly-log :: "} ...; <-- リクエスト受信時にログ出力（要カスタム VCL）
  ...
  return(lookup);
  log {"syslog 1234 fastly-log :: "} ...; <-- return 後のため出力されない
}

sub vcl_fetch {
  log {"syslog 1234 fastly-log :: "} ...; <-- オリジンからのレスポンス受信時にログ出力（要カスタム VCL）
　...
}

sub vcl_log {
  log {"syslog 1234 fastly-log :: "} ...; <-- オリジンからのレスポンス受信時にログ出力（GUI でのデフォルト設定）
  ...
}
```
また、出力先の制約で十分な容量が確保できないなどの理由で、エラー時のみ出力するなどの条件設定も可能です。[200番台以外をロギングする](http://qiita.com/Satoshi-Ishii/items/2e4d06a953aab20d5708#200%E7%95%AA%E5%8F%B0%E4%BB%A5%E5%A4%96%E3%82%92%E3%83%AD%E3%82%AE%E3%83%B3%E3%82%B0%E3%81%99%E3%82%8B)を参考に設定してみてください。

## フォーマットを決定
区切り文字の指定はシンプルで、UI 上で区切り文字を間に挿入するだけです。カンマであれば `%h,%l,%u,%t,"%r",%>s,%b` で OK です。タブの場合には `\t` を挿入します。
また、プレフィックスの変更には

```
$ curl -X PUT -H 'Fastly-Key: KEY' -H 'Content-Type: application/json' 'https://api.fastly.com/service/\<SERVICE ID\>/version/\<VERSION\>/logging/\<LOG TYPE\>/\<LOG\>' --data-binary '{"message_type":"\<MESSAGE TYPE\>"}'
```
で変更が可能です。API の詳細は英語ドキュメントですが [API Logging](https://docs.fastly.com/api/logging) を参照してみてください。

## ログの設定
上述で決定した事項を元に実際に [Fastly Control Panel](https://manage.fastly.com/) で設定を行います。実際の設定はログサーバによって設定項目は異なりますが、取得項目やフォーマットなどは共通です。
S3 と GCS については[FastlyのログをS3に保存する](http://qiita.com/Satoshi-Ishii/items/1ec701a5d823807a3a78)と[Fastly のログを BigQuery に取り込んでみる](http://qiita.com/Satoshi-Ishii/items/1f8b6ee09829c092658b)を参照してください。

## 出力の確認
実際にリクエストを投げてみて期待通りの出力が得られることを確認します。

以上が Fastly ログ設定の一連の流れとなります。