MyCSS

ラベル Development の投稿を表示しています。 すべての投稿を表示
ラベル Development の投稿を表示しています。 すべての投稿を表示

2010/03/16

Railsのログをsyslog-ngで集約する はてなブックマークに追加

Railsのログをsyslog-ngを使って一カ所にまとめる手順をメモしておきます。
使用前

ここにRailsのサーバーが3台あります。前段にはロードバランサーが立っています。ログはデフォルトの場所にバラバラに記録されるので、記録としては相当使いにくいものになります。
使用後

ログ集計用のログサーバーを別途立てます。Railsアプリはsyslog経由でログを記録するようにします。syslogにはsyslog-ngを使い、Railsアプリが出したログはudp経由でログサーバーに随時転送するようにします。
今回は例として、ポート番号を5140番とします。
ログサーバーはudp:5140を見張っていて、ログが流れてきたらファイルに書き出すという算段です。

導入
そもそもなんでsyslog-ngなのか?という点に関してですが、個人的には導入のしやすさでした。もちろんその他も多くの利点があると思います。

作業としては、syslog-ngのインストールと設定、RailsアプリをSyslogLogger経由でのロギングに変更するだけです。既に運用が始まったものでも、結構簡単に移行出来ると思います。

今時syslog-ngを導入するには、パッケージで一発インストールでしょうから、お決まりの呪文を唱えましょう。※Ubuntu Linux Server 9.10で試しています。
sudo apt-get install syslog-ng
当たり前だけど、Railsサーバー、ログサーバーとも両方行います。

次に、RailsアプリのロギングをRubyのLoggerから、SyslogLoggerへ切り替えます。といってもやる事は簡単で、gemでインストールして、ちょこっと設定を変えるだけです。
sudo gem install SyslogLogger

config/environment.rbに以下の記述を追記します。
Rails::Initializer.run do |config|
  # (中略)
  config.gem 'SyslogLogger', :lib => 'syslog_logger'
  # (中略)
end
今回の想定では本番環境のみsyslogでロギングしたいので、config/environments/production.rbに下記を追記します。最初の行に書いておいた方が良いでしょう。
require 'syslog_logger'
RAILS_DEFAULT_LOGGER = SyslogLogger.new "rails_app"
rails_appはRailsアプリのログである事を識別するためのラベル(プログラム名)です。これはsyslog-ngで使用します。(rails_appというのは例です。解りやすいものにする方が良いでしょう。)


syslog-ngの設定(Railsアプリ側)
syslog-ngの設定そのものは簡単です。Railsアプリのサーバーではログをudpでログサーバーに向けて流す設定を行います。
syslog-ngの設定ファイルは、Ubuntuの場合だと
/etc/syslog-ng/syslog-ng.conf
にありますので、コイツに追記してやる事にします。
destination dr_rails_app {
    udp("192.168.1.100" port(5140));
};

filter f_rails_app {
    program(rails_app);
};

log {
    source(s_all);
    filter(f_rails_app);
    destination(dr_rails_app);
};
ここでは便宜的に、ログサーバーのIPアドレスを192.168.1.100としています。
destinationとfilterを定義して、それをlogでまとめるという感じです。
destinationは、見ての通り192.168.1.100へudpの5140ポートで送ると記述します。
filterはRailsアプリ側で指定したラベル(プログラム名)を記述します。
logの中の、source(s_all)というのは、Ubuntuだと全てのメッセージソースという事でデフォルトで定義されているものです。(これは環境によって書き方が変わってくる部分だと思います。)syslogがうけたログで、rails_appというラベルの付いたものだけを抽出し、それをログサーバーに送るという記述になっています。


syslog-ngの設定(ログサーバー側)
次にログサーバー側の設定です。
source s_rails_app {
    udp(ip("0.0.0.0") port(5140));
};

destination df_rails_app {
    file("/var/log/rails/production.log");
};

filter f_rails_app {
    program(rails_app);
};

log {
    source(s_rails_app);
    filter(f_rails_app);
    destination(df_rails_app);
};
sourceは自分自身のudp:5140です。
destinationはログの書き出し場所をファイルパスで示しています。
filterはRailsアプリ側で指定したラベル(プログラム名)を記述します。
これらをまとめて、logの中に記述します。

セキュリティの絡みでもっとやるべき事があるとは思いますが、基本的な事はこれだけです。
ログの取りこぼしが絶対あってはならないものであれば、udp経由での通信は厳しいので避けるべきです。

参考にさせていただいたサイト:

2010/02/21

デブサミ史上最強最高のセッションを目撃した! はてなブックマークに追加

目黒雅叙園で開催されるDeveloper's Summit(デブサミ)に今年も参加してきました。
今年で何回目の参加になるだろう?フル参加は難しいとしても、あのポジティブな雰囲気が楽しくて、何かと都合を付けて毎年行っています。

今年はなんと言っても個人的にデブサミ史上最強最高のセッション、「建築から開発プロセスを学ぶ~パタンランゲージ」から得られるものがすごく大きかった。得られたというより、なにかヒントとなるような言葉をバシバシ浴びせられて、でも消化不良なんだけど、思ったり考えた事を少しずつ自分のものにしていって、外にも出して行こうみたいな、そんな感じです・・って、すでに文章がおかしいですが、とにかく何かを猛烈に浴びせられました(笑)

当日メモが取れないくらい心に沁み入ったので、
を参考に思い出しつつ、このエントリーを書きました。感謝です!!

「IT」とひとまとめにしちゃうと、いろんな要素が関わってきて複雑になるので、「ソフトウェア」に絞って思った事を書きます。デブサミもソフトウェア開発者の集まりだし。

建築とソフトウェア
建築って、人類が家を造るようになってからの壮大な歴史があるのに対し、ソフトウェア開発はたかだか何十年だから、そもそも比べるのもおこがましいような気もします。また一方で、実際の手で触れられるものを扱う建築と、触れられない抽象的なソフトウェアとでは問題の本質が違うと思います。
でも、最終的に人の暮らしの為に必要不可欠なものを作っていくという点では建築もITも同じだし、建築からアーキテクチャという言葉を貰ってきた以上、本質的に通じるものはなんなんだろう?と、以前からぼんやり考えていました。

セッション中の中埜先生の言葉で
全部の要素を満たす住宅を作ったが、機能的でいいんだけど心がない
という事は、身の回りの小さなレベルでよく経験する事だと思います。でも、そういう部分ってプロダクトデザインやソフトウェアユーザビリティーの分野で盛んに問題として取り上げられている部分だと思いますし、それなりに成果が出ているのではないか?とも思います。

でも、建築ってプロダクトそのものが人間の感性を刺激する役割があります。その場にいるだけでなんか気持ち良いと感じたり、雰囲気が開放的だから人のコミュニケーションが円滑になったり、その逆もあったりなど、建築の機能的な役割を果たす事は当然として、その先の人間に対する影響を考慮して「設計」するという部分にまで到達しています。もちろん専門的な事は全く知らないし、いまだに「パターン、Wiki、XP 」ですら未読な自分ですから、ド素人の意見です。でも、素直にそう感じてしまいます。

そういった、言葉にしづらいし、100人いれば100通りの意見が出てくる感性的な部分に対してどうやって折り合いを付けていくのか?それって、今まさにソフトウェア開発が直面している問題だし、その部分が上手く行っていると歴史的にコンセンサスがとれているソフトウェアってあるのかな?と率直に考えました。

ソーシャルアーキテクト?
前日の「アーキテクチャに憧れろ - 『ソフトウェアアーキテクトが知るべき97のこと』著者パネルディスカッション」というセッションでも出てきましたが、「ソーシャルアーキテクト」的な人材はまだ存在しないという事。中埜先生も様々な意見を取りまとめるコーディネーターが足りないとおっしゃっておりました。そういった流れを作るためにも、道具としてのパターンランゲージがもっと必要なのか?それ以前の問題なのか?アジャイル開発が現実的な解なのか?とか、考えれば考えるほど訳が分からなくなってきますね(苦笑)。

小津安二郎の映画で家族でおだやかに朝食を食べているシーンは、日本以外でも素直に心地よいと感じる事が出来る。そういった人類共通の感覚みたいなものはまさにソフトウェアに必要です。また、子供も年寄りも男も女も、年齢性別分け隔てなく使われていくソフトウェアは、今後の社会的責任の度合いが増していくでしょう。

「0」と「1」しか知らない馬鹿正直な「箱」に「ソースコード」を通して日々命を吹き込むソフトウェア開発者の人たちは、そういう重要な仕事をしているのだと自覚して、同時に胸を張るべきだと思います。

ソフトウェアアーキテクチャは建築アーキテクチャに比べてどうなのかとか、そういう比較論ではなくて、良い所でヒントになりそうな部分は取り入れるとか、手法を応用するなど、もっと相互のやり取りが出来るようになれば良いのかな?なんて思ってみたり。

自分の中でさっぱりまとまらないうちにエントリーを起こしてしまいました。でも、何かを書かずに入られませんでした。
私の父が建築業界で働いていた影響があるかもしれません。
祖父は大工でした。なにか血が騒いだのか!?という気がします。

いずれにしても、このようなセッションがデブサミで行われた事はちょっとした事件なんじゃないかと思います。セッション後の拍手の大きさが何よりもそれを物語っていたのではないでしょうか・・。

2010/01/26

Dropboxで手軽にSubversionのリポジトリ はてなブックマークに追加

個人で開発をやる際、複数のマシンでソースコードの同期をはかりたい場合があると思います。その際、Web上の無料のホスティングサービスなどを利用する機会が多いかと思いますが、Dropboxを使って、お手軽にSubversionのリポジトリの同期に成功したので、メモしておきます。

unfuddle.com
・・・と言っておきながら、全く関係ないサイトの紹介です(汗)。個人的にはここ半年くらい、GitとSubversionが無料で使える、unfuddle.comというサイトを使っています。
このサービスはプロジェクト管理(Redmineがベース??)が出来るので、かなり使えます。GitHubGoogle CodeSourceForge.JPのような、オープンソース対象のホスティングサイトとは異なり、無料アカウントでリポジトリを非公開に出来るのがポイントです。

でも、このサイトは基本的に「本気モードプロジェクト(?)」が対象です。チケット切って開発するようなプロジェクトに使うべきで、ちょっとした実験コードやメモなどはコミットしにくいという問題があります。

リポジトリのレイアウトを工夫すれば何とかなりそうだけど、本気モードプロジェクトにゴミを紛れ込ませるのはちょっと(笑)・・もっと単純に、ソースの同期だけでいいから手軽にできる方法がないかな?と考えていました。

Dropboxがあるじゃないか
Dropboxは今や手放す事ができない、便利すぎるサービスです。こいつをソースコードの同期に使えないか、以前試してみた事がありました。やり方としては非常に安易で、Dropboxフォルダに直接プロジェクトを作るやり方です。ですが、これはお勧めできません。例えばEclipseでJavaをやってると頻繁にコンパイルが走るので、細かいファイルが沢山更新されます。すると、Dropboxも一生懸命同期しようとして、動作が重くなります。また、ログファイルなどの「同期が不要なファイル」も同期してくれるので、ファイルサイズが大きいと悲惨です。無駄に計算資源とネットワークリソースを使ってしまうという、エコな観点からも(?)NGですね。

なんかうまい事できないかなぁ、と思っていましたが、「gitとDropboxでお手軽・無料のSource Hostingを実現する」という記事を見つけ、それSubversionに応用しよう!という事で試してみました。(前置きが長い)

何をどうする?
単に、リポジトリをDropboxに同期させるだけです。以上。・・だと、ブログに書くまでもないので、自分のやった事をさらしておきます。

やった事
まず、最初にお断りですが、MacOSX環境の話になります。ですが、どのプラットフォームでも基本的には同じだと思います。※Windows環境で同じような事をやっている方がいらっしゃいました。

Dropboxのフォルダは、デフォルトで

/Users/ユーザー名/Dropbox

になりますが、自分の場合、同期したいマシン間でユーザー名が違う(笑)ので、パスが統一できません。仕方がないので、Dropboxの初期設定から「Dropbox Folder Location」を選んで、下記に変更しました。

/Users/Shared/Dropbox


場所は基本的にどこでも良いと思いますが、マシン環境によって変わらない場所の方が良いです。また、この例では物理的にフォルダを移動させていますが、シンボリックリンクでも行けます。

リポジトリは、このDropboxフォルダの下に作ります。

svnadmin create /Users/Shared/Dropbox/SVNRepository

リポジトリのURLは

file:///Users/Shared/Dropbox/SVNRepository

です。つまり、ローカルリポジトリを使いつつ、Dropboxにリポジトリ自体を同期させるというやり方です。※最初はsvnserve立てようとか思っていましたが、よく考えたらfile://でいいや、という事に気がつきました。

しばらく使ってみていますが、特に問題は起きていないです。複数台同時に作業して、コミット/アップデートしていくとタイミング的におかしな事になりかねませんが、出先のノートでコミット、自宅のデスクトップでチェックアウト・・なんていう使い方だと問題ないかと思います。

ちなみにコミットはローカルなので早いですよ(笑)。