Rubyのloggerをnewした後にログファイルを削除するとどうなるのか

この投稿はRuby Advent Calendar 2014の7日目の記事です。

rubyには標準添付ライブラリにloggerクラスがある。
そのloggerクラス、newした後に出力先のログファイルが削除された時の挙動について調べた。
そして、file_safe_loggerというgemを作った。

検証

下記のようにして、Logger.newlogger.infoの間でファイルを削除してみる

1
2
3
4
5
6
7
require 'logger'
require 'fileutils'

logfile = 'test.log'
logger = Logger.new(logfile)
FileUtils.rm(logfile)
logger.info('this is test')

これは、結果としてはエラーにはならず正常終了するが、test.logというファイルはカレントディレクトリに存在せず、もちろんthis is testというlogも残っていない。

FileSafeLogger

ファイルが削除されるとlogging出来ないというのが困る時がある。
なので、file_safe_loggerというgemを作った。
やってることはいたって単純で、Logger::LogDevice.#writeメソッドをoverrideして、ファイルが存在しない場合は作成しているだけである。
file_safe_loggerを使って、先ほどのlogging処理と同じ処理をやってみる。

1
2
3
4
5
6
7
require 'file_safe_logger'
require 'fileutils'

logfile = 'test.log'
logger = FileSafeLogger.new(logfile)
FileUtils.rm(logfile)
logger.info('this is test')

これの実行後、カレントディレクトリにはtest.logが存在し、下記のようにlogが書き出されている。

$ cat test.log
# Logfile created on 2014-12-06 17:07:53 +0900 by logger.rb/44203
I, [2014-12-06T17:07:53.884806 #1547]  INFO -- : this is test

参考

sonots/process_safe_logger