我的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
答案 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