celluloidを使う機会が出たので、ついでにCelluloid::Loggerを使ってみたところ、Celluloid.logger.errorがthorのerrorに優先されてしまい期待通りの動きをしてくれなかった。
期待通り動かない場合
- 以下を実行するとsample.logにerrorが出力されずにstdoutに出力される
require 'thor'
require 'celluloid'
include Celluloid::Logger
Celluloid.logger = ::Logger.new("sample.log")
class SampleThor < Thor
desc "test", "sample"
def test
error "test"
end
end
SampleThor.start(ARGV)
- Celluloid.loggerのerrorでなくThor::Shell::Basicのerrorが呼ばれてしまうため
https://github.com/erikhuda/thor/blob/master/lib/thor/shell/basic.rb#L289-L291
それならばThor::Shell::Basicをoverrideしてしまえ
- Thor::Shell::Basic.errorをCelluloid.logger.errorにしてしまう
Thor::Shell::Basic.class_eval do
def error(statement)
Celluloid.logger.error(statement) if Celluloid.logger
end
end
- 上のサンプルを書き換えると期待通りsample.logにエラーが出力される
debug,info,warnはCelluloid::Loggerのものがそのまま使える
require 'thor'
require 'celluloid'
include Celluloid::Logger
Celluloid.logger = ::Logger.new("sample.log")
Thor::Shell::Basic.class_eval do
def error(statement)
Celluloid.logger.error(statement) if Celluloid.logger
end
end
class SampleThor < Thor
desc "test", "sample"
def test
error "test"
end
end
SampleThor.start(ARGV)