👻
nginxのログをBigQueryにインポートする
はじめに
nginxのログをBigQueryにインポートする設定のメモです。
手順の詳細は省略していますが、おおまかな設定などの参考になると思います。
この記事ではnginxを例として使っていますが、Apacheの場合は適宜読み替えてください。
必要なもの
以下のもののインストールや準備が必要です。
- BigQuery
- nginx
- fluentd
- fluentd-agent-lite
BigQuery
ログを受け取るテーブルを作成しておきます。
time INTEGER REQUIRED
size INTEGER NULLABLE
reqsize INTEGER NULLABLE
status INTEGER NULLABLE
host STRING NULLABLE
uri STRING NULLABLE
method STRING NULLABLE
referer STRING NULLABLE
ua STRING NULLABLE
vhost STRING NULLABLE
reqtime FLOAT NULLABLE
apptime FLOAT NULLABLE
全部REQUIRED
で良い気もしますが、何となくNULLABLE
になっています。
nginx
LTSV形式でログを出力するようにします。
log_format ltsv "time:$time_local"
"\thost:$remote_addr"
"\turi:$request_uri"
"\tstatus:$status"
"\tsize:$body_bytes_sent"
"\treqsize:$content_length"
"\tmethod:$request_method"
"\treferer:$http_referer"
"\tua:$http_user_agent"
"\treqtime:$request_time"
"\tapptime:$upstream_response_time"
"\tupstream:$upstream_addr"
"\tvhost:$host";
...
access_log /var/log/nginx/access.log ltsv;
通常の形式でも問題はありませんが、他にも何かと便利なのでLTSV形式を使っています。
fluent-agent-lite
保存したログは、fluent-agent-lite によって fluentd へ転送します。
TAG_PREFIX=""
LOGS=$(cat <<"EOF"
raw.nginx.access /var/log/nginx/access.log
EOF
)
PRIMARY_SERVER="xxx.xxx.xxx.xxx:24224"
fluentd
LTSV形式のアクセスログをparseします。
<match raw.nginx.*>
type parser
format ltsv
remove_prefix raw
key_name message
time_format %d/%b/%Y:%H:%M:%S %z
</match>
parseされたものをBigQueryに保存します。
<match nginx.access>
type copy
<store>
type bigquery
method insert
auth_method private_key
email youraccount@developer.gserviceaccount.com
private_key_path /etc/td-agent/bigquery.p12
project yourproject
dataset mixch
table http_%y%m
time_format %s
time_field time
field_integer time,size,reqsize,status
field_string host,uri,method,referer,ua,vhost
field_float reqtime,apptime
</store>
...
</match>
fluent-plugin-bigquery は table
のパラメータに日付のフォーマットを使うことが出来ます。
すべてのログを1つのテーブルに保存するのではなく、月ごとなどに分割することで、クエリのスキャンするデータ量を抑制するなどの効果があります。BigQueryは複数のテーブルに対してクエリを実行できるので、月をまたいだクエリも可能なため分割が問題にはなりません。
この記事はQiitaの記事をエクスポートしたものです
Discussion