SlideShare a Scribd company logo
Rails3+devise,nginx,fluent,S3構成での
       アクセスログ収集と蓄積
         アクセス分析に活用することを前提として、
          上記構成で構築したアプリケーションの
         アクセスログ収集と蓄積方法を説明します



              2012年8月22日
            三上威 (@takemikami)
     ※本文書の詳細は以下のブログでも説明しています。
      http://takemikami.com/technote/archives/658

        Copyright(C) 2012 Takeshi Mikami. All rights reserved.
目次
 本文書は次の構成をとります

 •    概要
 •    アクセスログ収集・蓄積の全体像
 •    trackingIDの付与とアクセスログへの出力
 •    アプリケーション上のユーザIDとアクセスログの紐付け
 •    詳細アクセスログの出力
 •    fluentdによるログ抽出と転送




Copyright(C) 2012 Takeshi Mikami. All rights reserved.
概要
 本文書の概要を示します

 • ユーザ認証が存在するWebアプリのアクセスログを有効に分析
   したい
   ⇒以下の2点を行う必要がある
       – Webサーバからアクセスログを集める
       – Webアプリのユーザとアクセスログを紐付ける


 • 本文書では、次の構成のWebアプリケーションで「アクセスログ
   の収集と蓄積」を行う流れを説明します
       –    Webサーバ: nginx
       –    開発フレームワーク: Ruby on Rails (認証プラグインとしてdevise)
       –    ログ集約: fluentd
       –    ログの格納先: Amazon S3


Copyright(C) 2012 Takeshi Mikami. All rights reserved.
アクセスログ収集・蓄積の全体像
 本スライドでは、アクセスログ収集と蓄積の全体像を示します。
                                                                                        ログの出力
          ①ユーザの訪問


                                        nginx                   Rails
                                                                         アプリDB
              ユーザ

          ④tracking用の                                    ②アプリからユーザID情報を送信
          cookie情報を送信
                                                   ③アクセスログにユーザID
                                                   トラッキング用cookie情報を出力
                                       ログ


           ①ログを監視し、条件
           に合うログを抽出                                        S3
                                                                                 抽出したログを集計し、
                             fluentd                                             分析に活用する想定
                                         抽出                             抽出
                                         ログ                             ログ

                               ②定期的にS3に転送
                                                                                       マーケター
 ログの収集・分析
Copyright(C) 2012 Takeshi Mikami. All rights reserved.
trackingIDの付与とアクセスログへの出力
 本スライドでは、nginxの機能を用いたtrackingIDの付与方法を示します。


 再訪問時のcookieイメージ                 ⇒2度目以降の訪問についてクライアントを一意に特定できる
                                   度目以降の訪問についてクライアントを一意に特定できる
                                          についてクライアント
  Cookie: uid=XXXXXXXXXXXXXXXXXXXXXXXX;

  ユーザの訪問
  初回訪問:cookie無し                                                  nginxの設定
  再訪問:cookie有り
                                                                    ■/etc/nginx/conf.d/default.confに追加
                                                                    userid on;
                                                                    userid_name uid;
                                                                    userid_path /;
                                          nginx                     userid_expires 365d;

             ユーザ


    tracking用のcookie情
    報を送信(初回訪問時
    のみ)
   初回訪問時のcookie設定イメージ
    Set-Cookie: uid=XXXXXXXXXXXXXXXXXXXXXXXX; path=/; expires=Thu, 20-Aug-2013 09:25:55 GMT; HttpOnly



Copyright(C) 2012 Takeshi Mikami. All rights reserved.
アプリケーション上のユーザIDとアクセスログの紐付け
 本スライドでは、RailsアプリのユーザIDをアクセスログに紐づける方法を示します。

 HTTP応答ヘッダ イメージ                     HTTP応答ヘッダ イメージ
                                      X-App-Userid: 2
  X-App-Userid: 2


  ユーザIDは送信さ                           アプリからユーザIDを送信                       ⇒アプリから送信した会員IDと
                                                                           アプリから送信した会員 と
                                                                                から送信した会員
  れない                                                                      nginxのログを紐付けできる
                                                                                のログを紐付けできる

                                nginx
                                                           Rails
                                                                      アプリDB
      ユーザ

                                                    Railsアプリへの改修
  nginxでユーザID
  ヘッダを削除                                             ■「app/controllers/application_controller.rb」
                                                     class ApplicationController < ActionController::Base
 nginxの設定                                             protect_from_forgery
                                                      after_filter :add_userid_toheader
                                                      def add_userid_toheader
   ■/etc/nginx/conf.d/default.confに追加
                                                        response.headers["X-App-Userid"]
   proxy_hide_header X-App-Userid;
                                                         = "#{user_signed_in? ? session['warden.user.user.key'][1][0] : nil}"
                                                      end
                                                     end



Copyright(C) 2012 Takeshi Mikami. All rights reserved.
詳細アクセスログの出力
 本スライドでは、詳細アクセスログの出力方法を示します。

                           nginxの設定

                               ■/etc/nginx/conf.d/default.confに追加
                               log_format detail_accesslog
          nginx                '"$time_local","$remote_addr","$uid_got","$upstream_http_x_app_userid","$remote_user","$re
                               quest","$status","$body_bytes_sent","$http_referer","$http_user_agent","$http_x_forwarded_f
                               or","$gzip_ratio"';
                               access_log /var/log/nginx/detail_access.log detail_accesslog;


                           ※ログ出力フォーマットの指定
                           trackingID: $uid_got
                           例)uid=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
                           ユーザID: $upstream_http_x_app_userid
                           例)2
         ログ


   出力ログのイメージ

    "21/Aug/2012:14:10:09 +0900","192.168.199.1","uid=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","2","-","GET /
    HTTP/1.1","304","0","-","Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.79
    Safari/537.1","-","-"



Copyright(C) 2012 Takeshi Mikami. All rights reserved.
fluentdによるログ抽出と転送
 本スライドでは、fluentdによるログ抽出と転送について示します。

                   fluentdの設定         ■/etc/fluent/fluent.confに追加
                                                                                                      正規表現にマッチ
                                      <source>                                                        するログを抽出
         ログを監視し、条件に                     type tail
         合うログを抽出                        format
                                      /^"(?<time_local>[^"]*)","(?<remote_addr>[^"]*)","(?<uid_got>[^"]*)","(?<upstream_http_x
                                      _app_userid>[^"]*)","(?<remote_user>[^"]*)","(?<request>[^"]*)","(?<status>[^"]*)","(?<bo
  ログ                                  dy_bytes_sent>[^"]*)","(?<http_referer>[^"]*)","(?<http_user_agent>[^"]*)","(?<http_x_for
                                      warded_for>[^"]*)","(?<gzip_ratio>[^"]*)"$/
                                        path /var/log/nginx/detail_access.log
                                        pos_file /tmp/td-agent/apache-web.pos
                                        tag nginx.access
   fluentd                            </source>
              抽出
              ログ

                                       ■/etc/fluent/fluent.confに追加
                    定期的に               <match nginx.access>
                    S3に転送               type s3
                                        aws_key_id <ここにaccess_key_idを入れる>
                    fluentdの設定          aws_sec_key <ここにsecret_access_keyを入れる>
                                        s3_bucket <ここにbucket名を入れる>
  S3                                    s3_endpoint s3-ap-northeast-1.amazonaws.com
                                        path log/
                                        buffer_path /var/log/fluent/s3
                                        time_slice_format /nginx/%Y%m/detail_access-jp.tabine.www-web.log.%Y%m%d%H
              抽出                        time_slice_wait 10m
              ログ                       </match>

Copyright(C) 2012 Takeshi Mikami. All rights reserved.

More Related Content

PPTX
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 3.5.0対応)
PPTX
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.1.0対応)
PDF
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
PPTX
FIWAREシステム内の短期履歴の管理
PDF
はじめてのMongoDB
PDF
MongoDBとAjaxで作る解析フロントエンド&GraphDBを用いたソーシャルデータ解析
PDF
Pro aspnetmvc3framework chap19
PPTX
コア・コンテキスト管理 - FIWARE WednesdayWebinars
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 3.5.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.1.0対応)
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
FIWAREシステム内の短期履歴の管理
はじめてのMongoDB
MongoDBとAjaxで作る解析フロントエンド&GraphDBを用いたソーシャルデータ解析
Pro aspnetmvc3framework chap19
コア・コンテキスト管理 - FIWARE WednesdayWebinars

What's hot (8)

PDF
スレッド単位で権限分離を行うWebサーバのアクセス制御アーキテクチャ
PPTX
FIWARE Big Data Ecosystem : Cygnus and STH Comet
PDF
OpenStack Study#9 JOSUG
PPTX
標的型攻撃からどのように身を守るのか
PDF
Rablock applicatin dev_guide_v1.2
PDF
The Latest Specs of OpenID Connect at #idcon 9
PDF
MongoDBざっくり解説
PPTX
IoT Agents をデバッグする方法 - FIWARE WednesdayWebinars
スレッド単位で権限分離を行うWebサーバのアクセス制御アーキテクチャ
FIWARE Big Data Ecosystem : Cygnus and STH Comet
OpenStack Study#9 JOSUG
標的型攻撃からどのように身を守るのか
Rablock applicatin dev_guide_v1.2
The Latest Specs of OpenID Connect at #idcon 9
MongoDBざっくり解説
IoT Agents をデバッグする方法 - FIWARE WednesdayWebinars
Ad

Similar to Rails3+devise,nginx,fluent,S3構成でのアクセスログ収集と蓄積 (20)

PDF
データマイニング+WEB勉強会資料第6回
PDF
AWSのログ管理ベストプラクティス
PDF
OpenStack API
PDF
実践 NestJS
PPT
Inside mobage platform
PDF
G0042 h
KEY
Rails and twitter #twtr_hack
 
PDF
多分モダンなWebアプリ開発
PDF
Azure Monitor Logで実現するモダンな管理手法
PPTX
Awsで構築したのだよ 01 ユーザのコンソール操作をログに残す
PPTX
msal.js v2を触る
PDF
mod_auth_ticket - Bringing Single-Sign-On to lighttpd
PPTX
Azure で Serverless 初心者向けタッチ&トライ
PPTX
Cloudstack user group meeting in osaka
PPT
Handlersocket etc. 20110906
PPTX
AWSにアップロードしたファイルに認証をつける(CloudFront+Lambda@Edge)
PDF
Djangoフレームワークの紹介
PDF
20120528 aws meister-reloaded-awssd-kforjava-public
PDF
ログ管理のベストプラクティス
PDF
CodeIgniter 〜 2008年大躍進のPHPフレームワーク
データマイニング+WEB勉強会資料第6回
AWSのログ管理ベストプラクティス
OpenStack API
実践 NestJS
Inside mobage platform
G0042 h
Rails and twitter #twtr_hack
 
多分モダンなWebアプリ開発
Azure Monitor Logで実現するモダンな管理手法
Awsで構築したのだよ 01 ユーザのコンソール操作をログに残す
msal.js v2を触る
mod_auth_ticket - Bringing Single-Sign-On to lighttpd
Azure で Serverless 初心者向けタッチ&トライ
Cloudstack user group meeting in osaka
Handlersocket etc. 20110906
AWSにアップロードしたファイルに認証をつける(CloudFront+Lambda@Edge)
Djangoフレームワークの紹介
20120528 aws meister-reloaded-awssd-kforjava-public
ログ管理のベストプラクティス
CodeIgniter 〜 2008年大躍進のPHPフレームワーク
Ad

More from Takeshi Mikami (20)

PDF
rdflintのvscode拡張の紹介とその実装方法
PDF
適切なクラスタ数を機械的に求める手法の紹介
PDF
OAuth 2.0による認可の流れ
PDF
MapReduceによるConnected Components(連結成分)の見つけ方
PDF
RDFチェックツール「rdflint」のご紹介 (LODチャレンジ2019受賞作品紹介 基盤技術部門優秀賞)
PDF
データサイエンスアイドル「小日向美穂」と考える「つながり」
PDF
RDFのチェックツール「rdflint」と コミュニティによるオープンデータの作成
PDF
CircleCIを使ったSpringBoot/GAEアプリ開発の効率化ノウハウ
PDF
GitHubの機能を活用したGitHub Flowによる開発の進め方
PDF
HBase CompleteBulkLoadその仕組み&発生した問題
PDF
RDFチェックツール「rdflint」のご紹介
PDF
アーリース情報技術株式会社 会社案内 (2019/02/13)
PDF
Spark MLlib ML Pipelines の概要 及びpysparkからの扱い方
PDF
SPARQL入門
PDF
センサーによるデータ計測と異常検知の基本
PDF
Webサイトのアクセスログによるユーザー属性推定
PDF
Google Cloud Dataflowによる データ変換処理入門
PDF
IoTでの機械学習活用イメージと強化学習のご紹介
PDF
協調フィルタリング・アソシエーション分析によるレコメンド手法の紹介
PDF
SparkMLlibで始めるビッグデータを対象とした機械学習入門
rdflintのvscode拡張の紹介とその実装方法
適切なクラスタ数を機械的に求める手法の紹介
OAuth 2.0による認可の流れ
MapReduceによるConnected Components(連結成分)の見つけ方
RDFチェックツール「rdflint」のご紹介 (LODチャレンジ2019受賞作品紹介 基盤技術部門優秀賞)
データサイエンスアイドル「小日向美穂」と考える「つながり」
RDFのチェックツール「rdflint」と コミュニティによるオープンデータの作成
CircleCIを使ったSpringBoot/GAEアプリ開発の効率化ノウハウ
GitHubの機能を活用したGitHub Flowによる開発の進め方
HBase CompleteBulkLoadその仕組み&発生した問題
RDFチェックツール「rdflint」のご紹介
アーリース情報技術株式会社 会社案内 (2019/02/13)
Spark MLlib ML Pipelines の概要 及びpysparkからの扱い方
SPARQL入門
センサーによるデータ計測と異常検知の基本
Webサイトのアクセスログによるユーザー属性推定
Google Cloud Dataflowによる データ変換処理入門
IoTでの機械学習活用イメージと強化学習のご紹介
協調フィルタリング・アソシエーション分析によるレコメンド手法の紹介
SparkMLlibで始めるビッグデータを対象とした機械学習入門

Rails3+devise,nginx,fluent,S3構成でのアクセスログ収集と蓄積

  • 1. Rails3+devise,nginx,fluent,S3構成での アクセスログ収集と蓄積 アクセス分析に活用することを前提として、 上記構成で構築したアプリケーションの アクセスログ収集と蓄積方法を説明します 2012年8月22日 三上威 (@takemikami) ※本文書の詳細は以下のブログでも説明しています。 http://takemikami.com/technote/archives/658 Copyright(C) 2012 Takeshi Mikami. All rights reserved.
  • 2. 目次 本文書は次の構成をとります • 概要 • アクセスログ収集・蓄積の全体像 • trackingIDの付与とアクセスログへの出力 • アプリケーション上のユーザIDとアクセスログの紐付け • 詳細アクセスログの出力 • fluentdによるログ抽出と転送 Copyright(C) 2012 Takeshi Mikami. All rights reserved.
  • 3. 概要 本文書の概要を示します • ユーザ認証が存在するWebアプリのアクセスログを有効に分析 したい ⇒以下の2点を行う必要がある – Webサーバからアクセスログを集める – Webアプリのユーザとアクセスログを紐付ける • 本文書では、次の構成のWebアプリケーションで「アクセスログ の収集と蓄積」を行う流れを説明します – Webサーバ: nginx – 開発フレームワーク: Ruby on Rails (認証プラグインとしてdevise) – ログ集約: fluentd – ログの格納先: Amazon S3 Copyright(C) 2012 Takeshi Mikami. All rights reserved.
  • 4. アクセスログ収集・蓄積の全体像 本スライドでは、アクセスログ収集と蓄積の全体像を示します。 ログの出力 ①ユーザの訪問 nginx Rails アプリDB ユーザ ④tracking用の ②アプリからユーザID情報を送信 cookie情報を送信 ③アクセスログにユーザID トラッキング用cookie情報を出力 ログ ①ログを監視し、条件 に合うログを抽出 S3 抽出したログを集計し、 fluentd 分析に活用する想定 抽出 抽出 ログ ログ ②定期的にS3に転送 マーケター ログの収集・分析 Copyright(C) 2012 Takeshi Mikami. All rights reserved.
  • 5. trackingIDの付与とアクセスログへの出力 本スライドでは、nginxの機能を用いたtrackingIDの付与方法を示します。 再訪問時のcookieイメージ ⇒2度目以降の訪問についてクライアントを一意に特定できる 度目以降の訪問についてクライアントを一意に特定できる についてクライアント Cookie: uid=XXXXXXXXXXXXXXXXXXXXXXXX; ユーザの訪問 初回訪問:cookie無し nginxの設定 再訪問:cookie有り ■/etc/nginx/conf.d/default.confに追加 userid on; userid_name uid; userid_path /; nginx userid_expires 365d; ユーザ tracking用のcookie情 報を送信(初回訪問時 のみ) 初回訪問時のcookie設定イメージ Set-Cookie: uid=XXXXXXXXXXXXXXXXXXXXXXXX; path=/; expires=Thu, 20-Aug-2013 09:25:55 GMT; HttpOnly Copyright(C) 2012 Takeshi Mikami. All rights reserved.
  • 6. アプリケーション上のユーザIDとアクセスログの紐付け 本スライドでは、RailsアプリのユーザIDをアクセスログに紐づける方法を示します。 HTTP応答ヘッダ イメージ HTTP応答ヘッダ イメージ X-App-Userid: 2 X-App-Userid: 2 ユーザIDは送信さ アプリからユーザIDを送信 ⇒アプリから送信した会員IDと アプリから送信した会員 と から送信した会員 れない nginxのログを紐付けできる のログを紐付けできる nginx Rails アプリDB ユーザ Railsアプリへの改修 nginxでユーザID ヘッダを削除 ■「app/controllers/application_controller.rb」 class ApplicationController < ActionController::Base nginxの設定 protect_from_forgery after_filter :add_userid_toheader def add_userid_toheader ■/etc/nginx/conf.d/default.confに追加 response.headers["X-App-Userid"] proxy_hide_header X-App-Userid; = "#{user_signed_in? ? session['warden.user.user.key'][1][0] : nil}" end end Copyright(C) 2012 Takeshi Mikami. All rights reserved.
  • 7. 詳細アクセスログの出力 本スライドでは、詳細アクセスログの出力方法を示します。 nginxの設定 ■/etc/nginx/conf.d/default.confに追加 log_format detail_accesslog nginx '"$time_local","$remote_addr","$uid_got","$upstream_http_x_app_userid","$remote_user","$re quest","$status","$body_bytes_sent","$http_referer","$http_user_agent","$http_x_forwarded_f or","$gzip_ratio"'; access_log /var/log/nginx/detail_access.log detail_accesslog; ※ログ出力フォーマットの指定 trackingID: $uid_got 例)uid=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ユーザID: $upstream_http_x_app_userid 例)2 ログ 出力ログのイメージ "21/Aug/2012:14:10:09 +0900","192.168.199.1","uid=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","2","-","GET / HTTP/1.1","304","0","-","Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.79 Safari/537.1","-","-" Copyright(C) 2012 Takeshi Mikami. All rights reserved.
  • 8. fluentdによるログ抽出と転送 本スライドでは、fluentdによるログ抽出と転送について示します。 fluentdの設定 ■/etc/fluent/fluent.confに追加 正規表現にマッチ <source> するログを抽出 ログを監視し、条件に type tail 合うログを抽出 format /^"(?<time_local>[^"]*)","(?<remote_addr>[^"]*)","(?<uid_got>[^"]*)","(?<upstream_http_x _app_userid>[^"]*)","(?<remote_user>[^"]*)","(?<request>[^"]*)","(?<status>[^"]*)","(?<bo ログ dy_bytes_sent>[^"]*)","(?<http_referer>[^"]*)","(?<http_user_agent>[^"]*)","(?<http_x_for warded_for>[^"]*)","(?<gzip_ratio>[^"]*)"$/ path /var/log/nginx/detail_access.log pos_file /tmp/td-agent/apache-web.pos tag nginx.access fluentd </source> 抽出 ログ ■/etc/fluent/fluent.confに追加 定期的に <match nginx.access> S3に転送 type s3 aws_key_id <ここにaccess_key_idを入れる> fluentdの設定 aws_sec_key <ここにsecret_access_keyを入れる> s3_bucket <ここにbucket名を入れる> S3 s3_endpoint s3-ap-northeast-1.amazonaws.com path log/ buffer_path /var/log/fluent/s3 time_slice_format /nginx/%Y%m/detail_access-jp.tabine.www-web.log.%Y%m%d%H 抽出 time_slice_wait 10m ログ </match> Copyright(C) 2012 Takeshi Mikami. All rights reserved.