21
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

はじめに

データに基き適切な意思決定を行うため、データ分析が重要視されています。
そこで欠かせない要素が、分析に必要なデータを集めるためのログ収集処理。

ログ収集ツールFluentdを使って、Nginxアクセスログを収集しMySQLに保存してみました。

構成

image.png

ログ収集に求められる機能

  • さまざまな構造・非構造データを収集可能
    • アプリ依存のログフォーマットを、分析に使えるように整形し一元化可能か
  • (ニア)リアルタイムにログ収集可能
    • ストリーミングや非同期処理によりログ収集の高速化可能か
  • システム性能へ影響しない
    • ログ収集のリソース消費による業務システムが性能劣化を抑制可能か
  • スケーラビリティ
    • データ量が急増しても、スケールアップ・スケールアウトにより対応可能か
  • ログ欠損の対策
    • バッファ機能やリトライ機構が備わっているか

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>

ログ収集の流れ

冒頭構成図の再掲です。

image.png

  • クライアントからNginxにHTTPリクエストを発行します
  • リクエストのボディなどのデータがNginxアクセスログに書き込まれます
  • FluentedがNginxアクセスログを監視し、ログ増分を収集します
  • 収集したログを、MySQLの指定テーブルに格納します
  • MySQLの保存データを使って、データ分析を行います

おわりに

Fluentdを使ってNginxアクセスログを収集してみました。
Fluentdの特徴として、ログ収集の方法と記録先を柔軟にカスタマイズできることを確認できました。

21
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?