はじめに
データに基き適切な意思決定を行うため、データ分析が重要視されています。
そこで欠かせない要素が、分析に必要なデータを集めるためのログ収集処理。
ログ収集ツールFluentdを使って、Nginxアクセスログを収集しMySQLに保存してみました。
構成
ログ収集に求められる機能
- さまざまな構造・非構造データを収集可能
- アプリ依存のログフォーマットを、分析に使えるように整形し一元化可能か
- (ニア)リアルタイムにログ収集可能
- ストリーミングや非同期処理によりログ収集の高速化可能か
- システム性能へ影響しない
- ログ収集のリソース消費による業務システムが性能劣化を抑制可能か
- スケーラビリティ
- データ量が急増しても、スケールアップ・スケールアウトにより対応可能か
- ログ欠損の対策
- バッファ機能やリトライ機構が備わっているか
Fluented(フルエントディー)とは
- ログ収集ミドルウェア
- ストリーミングデータ処理
- バッファ機能が備わっている
- プラグインによる機能拡張
Nginx(エンジンエックス)とは
- フリーかつオープンソースなWebサーバである
- 処理性能・高い並行性・メモリ使用量の軽減に焦点を当てて開発されている
- HTTP, HTTPS, SMTP, POP3, IMAPのリバースプロキシの機能を持つ
- ロードバランサ、HTTPキャッシュなどの機能も持つ
ログ収集を行うための設定
Nginxの設定
- クライアントからのHTTPリクエストボディを収集するため、アクセスログに記録しました
NginxのHTTP Echo
モジュールを使用し、HTTPリクエストボディをエコーバックします。
設定例:
load_module modules/ngx_http_echo_module.so;
location /xxx {
echo_read_request_body;
echo $request_body;
}
echo_read_request_body
ディレクティブを使って、リクエストボディを読み込み、
echo
ディレクティブを使って、リクエストボディをクライアントに返却します(これでアクセスログに記録されます)。
- アクセスログのフォーマットは、
ltsv
形式を使用しました
ltsv
は、Labeled Tab-separated Values
の略で、key:value
形式のタブ区切り形式です。
設定例:
http {
log_format ltsv escape=none 'timestamp:$time_iso8601\t'
'request_method:$request_method\t'
'uri:$request_uri\t'
'status:$status\t'
'size:$bytes_sent\t'
'request_body:$request_body';
}
Fluentdの設定
-
in_tail
入力プラグインを用いて、Nginxアクセスログファイルの末尾からログを読み取ります
in_tail
の動作は、tail -F
コマンドに似ています。
設定例:
<source>
@type tail
format ltsv
path /var/log/nginx/access.log
pos_file /var/log/td-agent/nginx.access.log.pos
tag nginx.access
</source>
-
filter_grep
フィルタープラグインを使って、ログ収集対象を絞り込みます
収集負荷の軽減とログ量の削減のため、収集対象データを絞り込みます。
request_methodがPOST
かつstatusが500
のアクセスログに絞り込むための設定例です:
<filter nginx.access>
@type grep
<regexp>
key request_method
pattern /^POST$/
</regexp>
<regexp>
key status
pattern /^500$/
</regexp>
</filter>
-
mysql_bulk
出力プラグインを使って、収集したログをMySQLに保存します
設定例:
<match nginx.access>
@type mysql_bulk
host <MySQLサーバーのホスト名>
port <MySQLサーバーのポート番号>
database <MySQLデータベース>
username <MySQLユーザ>
password <MySQLパスワード>
column_names <MySQLに格納する列名>
key_names <収集ログのキー(column_namesの列名と1対1の関係)>
table <保存先のMySQLテーブル>
flush_interval <バッファーのフラッシュ間隔>
buffer_chunk_limit <バッファーチャンク上限値>
buffer_queue_limit <バッファーに貯めるキュー上限値>
</match>
ログ収集の流れ
冒頭構成図の再掲です。
- クライアントからNginxにHTTPリクエストを発行します
- リクエストのボディなどのデータがNginxアクセスログに書き込まれます
- FluentedがNginxアクセスログを監視し、ログ増分を収集します
- 収集したログを、MySQLの指定テーブルに格納します
- MySQLの保存データを使って、データ分析を行います
おわりに
Fluentdを使ってNginxアクセスログを収集してみました。
Fluentdの特徴として、ログ収集の方法と記録先を柔軟にカスタマイズできることを確認できました。