前回は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を動かしてみようと思います。