在初始化文件中访问rails 2.2.2 config

时间:2015-10-21 08:21:09

标签: ruby-on-rails config ruby-on-rails-2

我的config/environments/production.rb环境文件中有一些用于rails 2.2.2应用程序的行,只有当我在本地计算机上运行时才会执行任何操作:

if ENV['HOME'] == "/home/max"
  #fall back to the default logger instead of hodel, locally
  config.logger = nil
  #put sql into a seperate log 
  config.active_record.logger = Logger.new("log/sql.log")
end

在应用程序的生产环境文件中使用它感觉非常脏。我有另一个文件config/initializers/max_local/send_mails_from_max_gmail.rb,它配置外发电子邮件以使用Gmail帐户,并在启动时执行其他一些特定于我的事情。

将我的记录器配置移动到那里似乎是比在production.rb文件中使用它更好的选择:首先,send_mails_from_max_gmail.rb文件被git忽略,所以没有人能看到它。

但是,我无法弄清楚如何在那里进入rails配置。它没有config局部变量,该变量存在于Rails::Initializer.run do |config|生成的块中。我怎么得到这个配置?

谢谢,Max

编辑:详细回复@ japed的答案,这需要一些格式,所以这里比评论更好。我将专注于config.active_record.logger = Logger.new("log/sql.log"),它将sql输出移动到log / sql.log而不是标准日志。

我尝试过以下方法: 更改了production.rb,如下所示:请注意记录器行已注释掉:

puts "production.rb:#{__LINE__} : config.active_record.logger = #{config.active_record.logger.inspect}"
#config.active_record.logger = Logger.new("log/sql.log")

将以下内容添加到config/initializers/max_local/send_mails_from_max_gmail.rb

puts "send_mails_from_max_gmail.rb:#{__LINE__} : Rails.configuration.active_record.logger = #{Rails.configuration.active_record.logger.inspect}"
Rails.configuration.active_record.logger = Logger.new("log/sql.log")
puts "send_mails_from_max_gmail.rb:#{__LINE__} : Rails.configuration.active_record.logger = #{Rails.configuration.active_record.logger.inspect}"

然后,我重新启动了我的服务器。我可以看到这个输出:

production.rb:65 : config.active_record.logger = nil
send_mails_from_max_gmail.rb:42 : Rails.configuration.active_record.logger = nil
send_mails_from_max_gmail.rb:44 : Rails.configuration.active_record.logger = #<Logger:0x7fcbee0fedc8 @formatter=nil, @progname=nil, @level=0, @logdev=#<Logger::LogDevice:0x7fcbee0fed28 @dev=#<File:log/sql.log>, @filename="log/sql.log", @mutex=#<Logger::LogDevice::LogDeviceMutex:0x7fcbee0fecd8 @mon_waiting_queue=[], @mon_entering_queue=[], @mon_count=0, @mon_owner=nil>, @shift_size=1048576, @shift_age=0>, @default_formatter=#<Logger::Formatter:0x7fcbee0fed78 @datetime_format=nil>>

看起来它正在工作,并且在主配置运行后发生覆盖。但是,sql没有进入log / sql.log,它进入标准的production.log

1 个答案:

答案 0 :(得分:0)

好的,深入了解文档和导轨2 Rails.logger映射到常量RAILS_DEFAULT_LOGGER docs

所以你应该能够做到

if ENV['HOME'] == "/home/max"
  RAILS_DEFAULT_LOGGER = Logger.new("log/sql.log")
end

这次在控制台中正确测试了

RAILS_DEFAULT_LOGGER = Logger.new("log/sql.log")
=> warning: already initialized constant RAILS_DEFAULT_LOGGER

>> Rails.logger.info "Blah"
=> true

我在log/sql.log

中得到了Blah