WebにはRuby on Railsを使うことにした。
Ruby on Railsのインストール手順は、本Postでは省略。
前提と仕様
今回はテスト用のため、fluentdで集めるのは同一サーバ上のApacheのアクセスログのみ。環境はCentOS 5.5。
とりあえず、検索条件としてクライアントIPアドレスと期間を指定できるようにしてみる。検索条件の入力省略も許容する。
クライアントIPアドレスには正規表現を使えるようにする。
fluentdとMongoDBのインストール
インターネットに自由に出られない環境へのインストールを見据え、yumは使わない。MongoDBのRPMはhttp://downloads-distro.mongodb.org/repo/redhat/os/i686/RPMS/から、fluentdのRPMはhttp://packages.treasure-data.com/redhat/i386/からダウンロードした。
まずfluentdをインストール。
$ cd /tmp/mongo+fluentd/ $ ls mongo-10gen-2.2.0-mongodb_1.i686.rpm td-agent-1.1.9-0.i386.rpm mongo-10gen-server-2.2.0-mongodb_1.i686.rpm td-libyaml-0.1.4-1.i386.rpm $ rpm -ivh td-* 準備中... ########################################### [100%] 1:td-libyaml ########################################### [ 50%] 2:td-agent ########################################### [100%] adding 'td-agent' group... adding 'td-agent' user... Installing default conffile ... prelink detected. Installing /etc/prelink.conf.d/td-agent-ruby.conf ... Configure td-agent to start, when booting up the OS...次にMongoDBをインストールし、起動。
$ rpm -ivh mongo* 準備中... : ########################################### [100%] 1:mongo-10gen ########################################### [ 50%] 2:mongo-10gen-server ########################################### [100%] $ service mongod start all output going to: /var/log/mongo/mongod.log forked process: 22342 child process started successfully, parent exiting [ OK ]fluentdのMongoプラグインをインストール。
$ /usr/lib/fluent/ruby/bin/fluent-gem install fluent-plugin-mongo Fetching: bson-1.7.0.gem (100%) Successfully installed bson-1.7.0 1 gem installed Installing ri documentation for bson-1.7.0... Installing RDoc documentation for bson-1.7.0...
Apacheのアクセスログをfluentd+MongoDBに入れてみる
まずfluentdの設定。$ vi /etc/td-agent/td-agent.conf
… (snip) <source> type tail format apache path /var/log/httpd/access_log tag mongo.apache </source> <match mongo.**> type mongo database apache collection access host localhost port 27017 flush_interval 10s </match>fluentdを起動。
$ service td-agent restart Shutting down td-agent: [ OK ] Starting td-agent: [ OK ]これでログ収集が始まったはずなので、その辺のPCのブラウザから適当にApacheにアクセスしてアクセスログを書き込んでみた。
MongoDBにアクセスログが入ったかどうか確認してみよう。
$ mongo MongoDB shell version: 2.2.0 connecting to: test Welcome to the MongoDB shell. For interactive help, type "help". For more comprehensive documentation, see http://docs.mongodb.org/ Questions? Try the support group http://groups.google.com/group/mongodb-user > show dbs apache0.0625GB local(empty) > use apache switched to db apache > show collections access system.indexes > db.access.find(); { "_id" : ObjectId("50444fef30bad75840000001"), "host" : "(クライアントのIPアドレス)", "user" : "-", "method" : "GET", "path" : "/", "code" : "304", "size" : "-", "referer" : "http://server/redmine", "agent" : "Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20100101 Firefox/15.0", "time" : ISODate("2012-09-03T06:36:26Z") } { "_id" : ObjectId("50444fef30bad75840000002"), "host" : "(クライアントのIPアドレス)", "user" : "-", "method" : "GET", "path" : "/javascripts/prototype.js?1290948531", "code" : "304", "size" : "-", "referer" : "http://server/", "agent" : "Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20100101 Firefox/15.0", "time" : ISODate("2012-09-03T06:36:28Z") } … (snip) > exit byeキタで! ちゃんと書き込まれてる。
Ruby on Railsでログ検索アプリを作る
では本題のログ検索アプリの開発に入る。今回は/var/www/配下に"fluentd"というプロジェクトを作ることにした。
(あまりいい名前じゃないな…)
$ cd /var/www $ rails fluentd exists create app/controllers create app/helpers create app/models create app/views/layouts create config/environments … (snip)"search"というコントローラを作る。"index""result"の2つのアクションを作成。
indexが検索条件入力画面、resultが検索結果表示画面のつもり。
$ cd fluentd $ ruby script/generate controller search index result exists app/controllers/ exists app/helpers/ create app/views/search exists test/functional/ create test/unit/helpers/ create app/controllers/search_controller.rb create test/functional/search_controller_test.rb create app/helpers/search_helper.rb create test/unit/helpers/search_helper_test.rb create app/views/search/index.html.erb create app/views/search/result.html.erbMongo以外のDBを使わないので、environment.rbに下記2行を追加(endの直前)。
$ vi /var/www/fluentd/config/environment.rb
… (snip) # 2012.09.05 dsp74118 config.frameworks -= [ :active_record ] (snip) …routes.dbは下記のように直した。
$ vi /var/www/fluentd/config/routes.rb
ActionController::Routing::Routes.draw do |map| # 2012.09.05 dsp74118 map.connect ':controller/:action' endでは、画面とロジックを作っていく。
まず、ログ検索画面のビューを作る。
一応断っておくと、HTMLは超手抜き。
$ cd /var/www/fluentd/app/views/search $ vi index.html.erb
<html> <head> <title>検索条件入力</title> </head> <body> <h1>検索条件入力</h1> <% form_tag "/search/result" do %> クライアントIPアドレス:<%= text_field_tag :HOST %> 検索範囲(開始日時):<%= text_field_tag :START %> 検索範囲(終了日時):<%= text_field_tag :END %> <%= submit_tag "検索" %> <% end %> </body> </html>コントローラを書く。
本当は検索処理はコントローラに書きたかったのだけど、作っていざ動かしてみたら、検索結果が大量に出すぎたためかCookieOverflowが出てしまった。これは、検索結果をセッション変数に乗せてビューに渡そうとしたことが原因なのは疑いようがなくて、もっといいやり方があるはず。
今回はテスト用の手抜き実装なので、コントローラではなくビューに検索処理を実装することにした。
というわけで、コントローラは検索パラメータを受け取るだけ。
$ cd /var/www/fluentd/app/controllers $ vi search_controller.rb
class SearchController < ApplicationController def index end def result flash[:queryHost] = params[:HOST] flash[:inputS] = params[:START] flash[:inputE] = params[:END] end end検索結果画面のビューを書く。デコレーションは一切なし。
$ cd /var/www/fluentd/app/views/search $ vi result.html.erb
<html> <head> <title>ログ検索結果</title> </head> <body> <h1>ログ検索結果</h1> <% require "time" require 'mongo' # ホスト(IPアドレス) queryHost = flash[:queryHost] if queryHost == '' then queryHost = '.*' end r = Regexp.new(queryHost) # 検索範囲(開始日時) inputS = flash[:inputS] if inputS == '' then inputS = '2000-01-01T00:00:00Z' end qts = Time.parse(inputS) # 検索範囲(終了日時) inputE = flash[:inputE] if inputE == '' then qte = Time.now else qte = Time.parse(inputE) end # MongoDBに接続 m = Mongo::Connection.new('localhost', 27017) db = m.db('apache') # クエリ results = db['access'].find({:host => r, :time => {"$gt" => qts, "$lte" => qte}}).to_a %> HOST:<%= queryHost %><br /> 日時:<%= qts %>~<%= qte %><br /><br /> <% results.each {|val| %> <%= val.inspect %><br /> <% } %> </body> </html>完成したのでサーバを起動してみる。
$ ruby script/server => Booting WEBrick => Rails 2.3.5 application starting on http://0.0.0.0:3000 => Call with -d to detach => Ctrl-C to shutdown server [2012-09-05 20:37:15] INFO WEBrick 1.3.1 [2012-09-05 20:37:15] INFO ruby 1.8.7 (2010-08-16) [i686-linux] [2012-09-05 20:37:15] INFO WEBrick::HTTPServer#start: pid=4551 port=3000無事起動したようだ。ブラウザでアクセスしてみよう。
Figure.1 検索条件入力画面 |
Figure.2 検索結果画面 |
MongoDBに入っているデータをそのまま出しただけなので見た目は最悪だが、今回は目をつむる。
とりあえず今回はここまで。
検証用に作ったシステムなので、これ以上手を入れるかは未定。
0 コメント:
コメントを投稿