[ruby-list:50119] STDERRをLoggerへリダイレクトしたい
From:
増田悦久 <uta2ne@...>
Date:
2015-04-25 02:34:10 UTC
List:
ruby-list #50119
マスダといいます。
標準エラーをログしたくて以下のようなスクリプトを書いてみましたが、いろ
いろと不都合があり困っています。
--------
#!/usr/bin/env ruby
# coding: UTF-8
require 'logger'
require 'fileutils'
require 'pathname'
reporter = Logger.new("./path/to/prog.log")
reporter.level = Logger::INFO
$stderr = STDERR.dup
stderr, w = IO.pipe
STDERR.reopen w
from = "./path/to/src/"
to_prefix = "./path/to/dest/"
Pathname.glob("#{from}*") { |fpath|
begin
to = "#{to_prefix}#{fpath.basename('.*')}/"
FileUtils::Verbose.cp(f,to)
rescue Errno::ENOENT => nodir_retry
begin
FileUtils::Verbose.mkdir(to)
retry
rescue => nodir_next
log.error(e)
next
ensure
log.info(stderr.readline.chomp)
end
rescue => e
log.error(e)
next
ensure
log.info(stderr.readline.chomp)
end
}
--------
実際はもう少し複雑なことをしてますが、最初は
begin
#標準エラーに出力する処理
ensure
#標準エラーを読み込む処理
end
で1セットにしたらいいだけかと思っていました。しかし例外処理が入る
と順番が時系列に並ばなかったりして複雑です。
そればかりか変なところで"stderr.readline"を呼び出していると入力
待ち(?)状態になって最悪スクリプトが止まってしまいます。
こういう場合に標準エラーをもっと簡単に扱える方法があるでしょうか?
ちなみに、
def STDERR.write(str)
LOG.error(str)
end
という無理矢理っぽい方法も試してみましたが、謎の改行が入ったりして
どうもうまくいきませんでした。
何かヒントでもいただけたら幸いです。