マスダといいます。

標準エラーをログしたくて以下のようなスクリプトを書いてみましたが、いろ
いろと不都合があり困っています。

--------
#!/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
という無理矢理っぽい方法も試してみましたが、謎の改行が入ったりして
どうもうまくいきませんでした。

何かヒントでもいただけたら幸いです。