2009年8月25日火曜日

[Rails][CodeReading] Rails::Initializer (14) initialize_logger

Initializer.process で14番目に呼ばれる initialize_logger メソッド。

def initialize_logger
# if the environment has explicitly defined a logger, use it
return if Rails.logger

unless logger = configuration.logger
begin
logger = ActiveSupport::BufferedLogger.new(configuration.log_path)
logger.level = ActiveSupport::BufferedLogger.const_get(configuration.log_level.to_s.upcase)
if configuration.environment == "production"
logger.auto_flushing = false
end
rescue StandardError => e
logger = ActiveSupport::BufferedLogger.new(STDERR)
logger.level = ActiveSupport::BufferedLogger::WARN
logger.warn(
"Rails Error: Unable to access log file. Please ensure that #{configuration.log_path} exists and is chmod 0666. " +
"The log level has been raised to WARN and the output directed to STDERR until the problem is fixed."
)
end
end

silence_warnings { Object.const_set "RAILS_DEFAULT_LOGGER", logger }
end


最初に、Rails.logger を見て、nil でなければ何もせず返ります。Rails.logger は

def logger
if defined?(RAILS_DEFAULT_LOGGER)
RAILS_DEFAULT_LOGGER
else
nil
end
end

となっているので、RAILS_DEFAULT_LOGGER が設定されていれば、何もせず返ることになります。

unless logger = configuration.logger
の行まできたとき、logger は必ずnilなので、この = が成り立つのは、configuration.logger が nil のとき。
したがって、logger = nil, configuration.logger != nil のときに unless の中が実行されます。
logger の実体はActiveSupport::BufferedLoggerクラスのインスタンスで、初期化時にログファイルのパスを渡しています(configuration.log_path)。
Configuratoin.log_path のデフォルト値は以下のメソッドで与えられます。

def default_log_path
File.join(root_path, 'log', "#{environment}.log")
end

developmentモードの場合、ログファイルは $RAILS_ROOT/log/development.log となります。

初期化後すぐにログレベル(logger.level)の設定も行っています。Configuration.log_level のデフォルト設定メソッドが

def default_log_level
environment == 'production' ? :info : :debug
end

なので、production環境の場合は INFO, それ以外は DEBUG レベルに設定されるようです。

また、ログファイルが見つからない場合 or 書き込み権限がない場合は、エラーを拾って出力先を STDERR に変更しています。

[Rails][CodeReading] Railsの初期化コードを読む (イントロ&目次)

0 件のコメント:

コメントを投稿