データの種類と頻度に合わせたデータ収集方法
データ分析を行っていく上で、
こうした多種多様なデータを横断的に分析するためには、
このようなケースにおいて、
ストリーミング処理では、

今回と次回で、
Fluentdでアクセスログをストリーミングで収集する
Fluentdとは
Fluentdとは、
Fluentdのインストール
Fluentdを使うためには、
- Fluentd
- Rubyのパッケージ管理システムのRubyGemsで配布をされており、
最新版や独自Rubyバージョンで利用したい場合にはこちらを利用します。 - td-agent
- 米トレジャーデータ社によって、
依存関係を考慮してパッケージングされており、 基本的にはtd-agentをインストールするのが一番簡単です。また、 現在のところ下記の2種類が提供されています。 - td-agent1
- Ruby1.
9系でパッケージングされたバージョンです。Ruby1. 9系の修正・ サポートの提供が停止したため、 td-agent1もセキュリティフィクスのみの提供となっています。 - td-agent2
- Ruby2.
1系でパッケージングされたバージョンです。現在の安定版となっているため、 通常はこちらを利用してください。
さて、
$ curl -L https://td-toolbelt.herokuapp.com/sh/install-ubuntu-trusty-td-agent2.sh | sh
アクセスログのフォーマット
Fluentdをインストールして、
一般的に、
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
Format String | 説明 |
---|---|
%h | リクエストしたリモートホスト名 |
%l | リモートユーザ名 |
%u | 認証に使用されたリモートユーザ |
%t | リクエストを受けた時刻 |
%r | HTTPリクエストヘッダ |
%>s | サーバがリクエストに対して返したステータスコード |
%b | HTTPヘッダを除いた転送バイト数 |
%{Referer}i | Refererヘッダの内容 |
%{User-Agent}i | User-Agentヘッダの内容 |
しかし、
クッキーIDを設定するためのApacheのログを生成するためには、
また合わせて、
これらの設定を実現するためには、
"time:%{%Y-%m-%d %H:%M:%S %z}t\tdomain:%V\thost:%h\tserver:%A\tident:%l\tuser:%u\tmethod:%m\tpath:%U%q\tprotocol:%H\tstatus:%>s\tsize:%b\treferer:%{Referer}i\tagent:%{User-Agent}i\tresponse_time:%D\tcookie:%{cookie}i\tset_cookie:%{Set-Cookie}o" ltsv
項目名 | Format String | 説明 |
---|---|---|
domain | %V | Hostヘッダの内容 |
host | %h | リクエストしたリモートホスト名 |
server | %A | 応答を返したサーバのローカルIPアドレス |
ident | %l | リモートユーザ名 |
user | %u | 認証に使用されたリモートユーザー名 |
time | %{%Y-%m-%d %H:%M:%S %z}t | リクエストを受けた時刻 |
method | %m | リクエストメソッド |
path | %U%q | REQUEST_ |
protocol | %H | リクエストプロトコル |
status | %>s | サーバがリクエストに対して返したステータスコード |
size | %b | HTTPヘッダを除いた転送バイト数 |
referer | %{Referer}i | Refererヘッダの内容 |
agent | %{User-Agent}i | User-Agentヘッダの内容 |
response_ |
%D | リクエストを処理するのにかかった時間、 |
cookie | %{cookie}i | サーバが受信したクッキー |
set_ |
%{Set-Cookie}o | サーバが送出したクッキー |
上記のパラメータを元に生成されたログは下記のようになります。
time:2015-07-26 08:58:20 +0000 domain:52.69.91.201 host:153.232.253.97 server:172.31.6.70
ident:- user:- method:GET path:/index.html protocol:HTTP/1.1 status:200 size:3256
referer:- agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/600.7.12 (KHTML, like Gecko) Version/8.0.7 Safari/600.7.12
response_time:795 cookie:- set_cookie:Apache=2a4375d6.51bc3704b915f; path=/; expires=Tue, 25-Jul-17 08:58:20 GMT
アクセスログ(LTSV形式)を集める
ここまでの説明でApacheのアクセスログをLTSV形式で/var/
<source>
@type tail
path /var/log/apache2/access.log
pos_file /var/log/td-agent/access.log.pos
tag apache.access
format ltsv
time_key time
read_from_head
</source>
<match apache.access>
@type stdout
</match>
設定ファイルを/etc/
$ service td-agent start
すると、
2015-07-26 17:58:20 +0900 apache.access: {"domain":"52.69.91.201",
"host":"153.232.253.97","server":"172.31.6.70",
"ident":"-","user":"-","method":"GET",
"path":"/index.html","protocol":"HTTP/1.1",
"status":"200","size":"3256","referer":"-",
"agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/600.7.12 (KHTML, like Gecko) Version/8.0.7 Safari/600.7.12",
"response_time":"795","cookie":"-","set_cookie":"Apache=2a4375d6.51bc3704b915f; path=/; expires=Tue, 25-Jul-17 08:58:20 GMT"}
2015-07-26 17:58:21 +0900 apache.access: {"domain":"52.69.91.201",
"host":"153.232.253.97","server":"172.31.6.70",
"ident":"-","user":"-","method":"GET",
"path":"/index.html","protocol":"HTTP/1.1",
"status":"200","size":"3256","referer":"-",
"agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/600.7.12 (KHTML, like Gecko) Version/8.0.7 Safari/600.7.12",
"response_time":"670","cookie":"Apache=2a4375d6.51bc3704b915f","set_cookie":"-"}
集めたログを分析エンジンへ送る
さて、
また、
まずはデフォルトではインストールされないmysqlのプラグインをインストールします。
$ td-agent-gem install fluent-plugin-mysql
# エラーが発生した場合は、ubuntuの場合は下記をインストールしておきましょう
$ sudo apt-get install libmysqlclient-dev gcc make
前述の設定ファイルと組み合わせた設定が下記となります。
# ファイルからtailで読み込みます
<source>
@type tail # @は、plugin固有の設定ではなく、Fluentd自体の設定のときの区別用に付与します
path /var/log/apache2/access.log
pos_file /var/log/td-agent/access.log.pos
tag apache.access
format ltsv # LTSV形式としてパースします
time_key time
read_from_head # ファイルの先頭から読み込みます
</source>
<match apache.access>
@type copy
<store>
@type s3
aws_key_id AWS_KEY_ID
aws_sec_key AWS_SECRET_KEY
s3_bucket BUCKET_NAME
s3_region ap-northeast-1
format json
time_slice_format %Y%m%d/%Y%m%d-%H%M
time_slice_wait 10m
path apache_logs/
s3_object_key_format %{path}%{time_slice}_%{index}_%{hostname}.%{file_extension}
store_as gzip
buffer_type file
buffer_path /var/log/td-agent/buffer/s3
buffer_chunk_limit 32m
buffer_queue_limit 1024
</store>
<store>
@type mysql
host HOSTNAME
port 3306
database DATEBASE
username USERNAME
password PASSWORD
include_time_key yes
time_format %Y-%m-%d %H:%M:%S %z
key_names domain,host,server,ident,user,time,method,path,protocol,status,size,referer,agent,response_time,cookie,set_cookie
sql INSERT INTO accesslog (domain,host,server,ident,user,time,method,path,protocol,status,size,referer,agent,response_time,cookie,set_cookie) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
flush_interval 10s
buffer_type file
buffer_path /var/log/td-agent/buffer/mysql
buffer_chunk_limit 32m
buffer_queue_limit 1024
</store>
</match>
先ほど、
またインポート前の準備として、
CREATE TABLE IF NOT EXISTS `testdb`.`accesslog` (
`log_id` INT NOT NULL AUTO_INCREMENT ,
`domain` VARCHAR(255) NOT NULL ,
`host` VARCHAR(255) NOT NULL ,
`server` VARCHAR(255) NOT NULL ,
`ident` VARCHAR(255) NOT NULL ,
`user` VARCHAR(255) NOT NULL ,
`time` TIMESTAMP NOT NULL ,
`method` VARCHAR(255) NOT NULL ,
`path` VARCHAR(512) NOT NULL ,
`protocol` VARCHAR(255) NOT NULL ,
`status` INT NOT NULL ,
`size` INT NOT NULL ,
`referer` VARCHAR(512) NOT NULL ,
`agent` VARCHAR(255) NOT NULL ,
`response_time` DOUBLE NOT NULL ,
`cookie` VARCHAR(512) NOT NULL ,
`set_cookie` VARCHAR(512) NOT NULL ,
PRIMARY KEY (`log_id`, `time`));
それでは、
その後、
log_ | 1 | 2 |
---|---|---|
domain | 52. | 52. |
host | 153. | 153. |
server | 172. | 172. |
ident | - | - |
user | - | - |
time | 2015-07-26 08:58:20 | 2015-07-26 08:58:21 |
method | GET | GET |
path | /index. | /index. |
protocol | HTTP/ | HTTP/ |
status | 200 | 200 |
size | 3256 | 3256 |
referer | - | - |
agent | Mozilla/ |
Mozilla/ |
response_ | 795 | 670 |
cookie | - | Apache=2a4375d6. 51bc3704b915f |
set_ | Apache=2a4375d6. 51bc3704b915f; path=/; expires=Tue, 25-Jul-17 08:58:20 GMT | - |
さて、
おまけ:最近のFluentdの動向
Fluentdでは、
1. Filter pluginの導入
Fluentdが普及するにつれて、
そこで、
# Fluentd v0.10の設定
<source>
@type tail
tag raw.foo
</source>
<match raw.foo>
@type filter
remove_tag_prefix raw.
</match>
<match foo>
@type s3
</match>
上記の設定では、
Source -> Input - TAG(raw.foo) -> Output -> - TAG(foo) -> Output -> Database |------------------ Fluentd -----------------------------|
しかし、
# Fluentd v0.12の設定
<source>
@type tail
tag foo
</source>
<filter foo>
@type filter
</match>
<match foo>
@type s3
</match>
Source -> Input - TAG(foo) -> Filter -> - TAG(foo) -> Output -> Database |---------------- Fluentd ---------------------------|
2. Label機能の導入
Fluentdでは、
下記の設定ファイルの場合には、
<source>
type forward
@label @PROD
port 24224
</source>
<source>
@type forward
@label @TEST
port 24225
</source>
<label @PROD>
<match forward.**>
@type tdlog
</match>
</label>
<label @TEST>
<match forward.**>
@type stdout
</match>
</label>
3. At-least-onceのサポート
Fluentdのin_
at-least-onceとは、
これにより、
<match forward.**>
@type forward
require_ack_response
</match>
4. DockerのLogging Driverへの導入
最近のFluentdの話題として、
コンテナ管理のKubernetesでのロギングレイヤーとしてGoogleがFluentdを採用しただけでなく、

ストリーミング処理のおわりに
今回は、
分析エンジンによっては、