2008年12月21日日曜日

WEBrick::Logでロギングしてみました。

こんにちは、モリモルです。

前回はWEBrickでHTTPサーバーを書きました。
今日は、WEBrick::Logクラスを使って、ロギング機能を追加したいと思います。

ディレクトリ構成
------------------------------------------------------------
/var2
|-- logs
 |-- log <----ログを記録するファイル
|-- www
 |-- index.html
------------------------------------------------------------
logsディレクトリ以下は、server.rbを実行するユーザーが書き込める権限が必要です。

前回書いたスクリプトにロギング機能を追記します。

server.rb
------------------------------------------------------------

1 #!/usr/local/bin/ruby
2
3 require 'webrick'
4 include WEBrick
5
6 begin
7 log = File.open("/var2/logs/log", "a")
8 rescue
9 puts "ERROR #{$!.message}"
10 log.close unless log.closed?
11 end
12
13 logger = Log.new(log, BasicLog::DEBUG)

14
15 server = HTTPServer.new(
16 :DocumentRoot => "/var2/www",
17 :Port => 20080,
18 :BindAddress => "192.168.207.128",
19 :Logger => logger )
20
21 trap("INT"){server.stop}
22
23 server.start

------------------------------------------------------------
青い部分が追記した箇所になります。

6~11行目で、ログを記録するファイルオブジェクトを生成。
13行目で、Logクラスのコンストラクタにファイルオブジェクトを渡してLogファイルオブジェクトを生成します。引数の2つ目はどのよなログを記録するかを指定しています。
今回は一番レベルの低い(DEBUG)を指定しました。
19行目で、HTTPServerクラスのコンストラクタに、Logオブジェクトを渡します。


では、サーバーを起動してみましょう。
------------------------------------------------------------

$ > ./server.rb &
$ > tail /var2/logs/log
[2008-12-19 12:30:30] INFO WEBrick 1.3.1
[2008-12-19 12:30:30] INFO ruby 1.8.7 (2008-06-09) [i686-linux]

------------------------------------------------------------
WEBrickの起動がログとして出力されました。

この後、ブラウザからアクセスしてログが出力されるか確認したのですが、出力はされませんでした。

おかしいなぁ。と思い、WEBrickを終了すると一気にログを吐き出しました。
------------------------------------------------------------

$> fg
./server.rb
【ctl + C】で停止
$> tail -20 /var2/logs/log
[2008-12-19 12:30:30] INFO WEBrick 1.3.1
[2008-12-19 12:30:30] INFO ruby 1.8.7 (2008-06-09) [i686-linux]
[2008-12-19 18:13:45] INFO WEBrick 1.3.1
[2008-12-19 18:13:45] INFO ruby 1.8.7 (2008-06-09) [i686-linux]
[2008-12-19 18:13:55] DEBUG TCPServer.new(192.168.207.128, 20080)
[2008-12-19 18:13:55] DEBUG WEBrick::HTTPServlet::FileHandler is mounted on /.
[2008-12-19 18:13:55] INFO WEBrick::HTTPServer#start: pid=2262 port=20080
[2008-12-19 18:46:31] DEBUG accept: 192.168.207.1:2994
[2008-12-19 18:46:51] DEBUG WEBrick::HTTPServlet::FileHandler is invoked.
[2008-12-19 18:47:11] DEBUG WEBrick::HTTPServlet::FileHandler is invoked.
[2008-12-19 18:47:11] ERROR `/favicon.ico' not found.
[2008-12-19 18:47:11] DEBUG close: 192.168.207.1:2994
[2008-12-19 18:47:21] DEBUG accept: 192.168.207.1:3011
[2008-12-19 18:47:41] DEBUG WEBrick::HTTPServlet::FileHandler is invoked.
[2008-12-19 18:47:41] ERROR `/favicon.ico' not found.
[2008-12-19 18:47:41] DEBUG close: 192.168.207.1:3011
[2008-12-19 18:48:25] INFO going to shutdown ...
[2008-12-19 18:48:25] INFO WEBrick::HTTPServer#start done.

------------------------------------------------------------
どうやら、ログの出力がFileオブジェクトに溜まったままで、WEBrickを終了しないとファイルに出力されなかったようです。
リファレンスにLog.new演算子の第一引数には、「メソッド << が定義されたオブジェクト。普通は String オブジェクトか IO オブジェクト。」と書いてあったので、Fileオブジェクトでいいのかな。と勘違いしていました。
単純にログファイルへのパスを指定すればOKのようです。

13行目を書き直します。(6~11行目は削除)
------------------------------------------------------------

13 logger = Log.new(log, BasicLog::DEBUG)

13 logger = Log.new("/var2/logs/log", BasicLog::DEBUG)

------------------------------------------------------------

これで、再度WEBrickを起動すると、tail -fでログのリアルタイム出力が確認できました。
めでたし。めでたし。

次回は、WEBrick上で、CGIを動かしてみようと思います。