Answers:
将其放入application.rb
或放入rake任务初始化代码
if defined?(Rails) && (Rails.env == 'development')
Rails.logger = Logger.new(STDOUT)
end
这是Rails 3代码。请注意,这将覆盖记录到development.log
。如果你想同时STDOUT
和development.log
你需要的包装功能。
如果仅在Rails控制台中希望这种行为,请将相同的代码块放入中~/.irbrc
。
config.logger = Logger.new(STDOUT)
瑞克任务由用户在命令行上运行。他们需要立即知道的所有信息(“已处理的5行”)都应该在终端上输出puts
。
后代需要保留的所有内容(“将警告电子邮件发送到jsmith@example.com”)都应发送到Rails.logger
。
我会说使用Rails.logger.info
是必经之路。
您将无法在服务器控制台中看到它,因为它不会通过服务器运行。只要打开一个新的控制台和tail -f
日志文件,它就可以解决问题。
许多用户都知道UNIX®命令“ tail”,该命令可用于显示大文件的最后几行。这对于查看日志文件等很有用。
在某些情况下甚至更有用的是'tail'命令的'-f'参数。这会使tail尾随其后的文件输出。最初,响应本身将与对“ tail”的响应相同-将显示文件的最后几行。但是,该命令不会返回到提示,而是继续“关注”文件。将其他行添加到文件后,它们将显示在终端上。这对于观看日志文件或随时间推移可能附加的任何其他文件非常有用。输入“ man tail”以获取有关此选项和其他尾部选项的更多详细信息。
(通过)
tailf
“它类似于tail -f,但是当文件不增长时不访问该文件”(来自联机帮助页)。它也更短
对于Rails 4及更高版本,您可以使用Logger broadcast。
如果要在开发模式下同时获取rake任务的STDOUT和文件日志记录,可以将此代码添加到config/environments/development.rb
:
if File.basename($0) == 'rake'
# http://stackoverflow.com/questions/2246141/puts-vs-logger-in-rails-rake-tasks
log_file = Rails.root.join("log", "#{Rails.env}.log")
Rails.logger = ActiveSupport::Logger.new(log_file)
Rails.logger.extend(ActiveSupport::Logger.broadcast(ActiveSupport::Logger.new(STDOUT)))
end
这是一个小的Rake任务,用于测试上述代码:
# lib/tasks/stdout_and_log.rake
namespace :stdout_and_log do
desc "Test if Rails.logger outputs to STDOUT and log file"
task :test => :environment do
puts "HELLO FROM PUTS"
Rails.logger.info "HELLO FROM LOGGER"
end
end
运行rake stdout_and_log:test
输出
HELLO FROM PUTS
HELLO FROM LOGGER
而
HELLO FROM LOGGER
已添加到中log/development.log
。
运行rake stdout_and_log:test RAILS_ENV=production
输出
HELLO FROM PUTS
而
HELLO FROM LOGGER
已添加到中log/production.log
。
basename($0) == 'rake'
技巧不再起作用,因为rails
命令本身会运行rake
。我很想为它找一个好的替代品,而不仅仅取决于设置任务broadcast
。(至少该部分仍然可以正常工作。)
Rakefile
项目的根目录下
如何创建一个应用程序帮助程序来检测正在运行的环境并做正确的事情?
def output_debug(info)
if RAILS_ENV == "development"
puts info
else
logger.info info
end
end
然后调用output_debug而不是puts或logger.info
在Rails 2.X中,将记录器重定向到模型中的STDOUT:
ActiveRecord::Base.logger = Logger.new(STDOUT)
要在控制器中重定向记录器:
ActionController::Base.logger = Logger.new(STDOUT)
使用“&”执行后台作业,然后打开脚本/控制台或其他命令。这样,您可以在同一窗口中运行多个命令。
tail -f log/development.log &
script/console
Loading development environment (Rails 2.3.5)
>> Product.all
2011-03-10 11:56:00 18062 DEBUG Product Load (6.0ms) SELECT * FROM "products"
[<Product.1>,<Product.2>]
note备注当有大量日志输出时,可能很快变得草率。
Rails.logger = Logger.new(STDOUT)
development.rb 会更容易吗?