ruby-on-rails 将vs logger放入rails rake任务中

im9ewurl  于 2023-10-21  发布在  Ruby
关注(0)|答案(9)|浏览(151)

在一个rake任务中,如果我使用puts命令,那么我会在控制台上看到输出。但是,当应用程序部署到生产环境中时,我不会在日志文件中看到该消息。
但是,如果我说Rails.logger.info,那么在开发模式下,我在控制台上看不到任何东西。我得去日志文件里跟踪一下。
我希望使用Rails.logger.info,并在rake任务内部的开发模式下,logger的输出也应该发送到控制台。
有没有办法做到这一点?

vh0rcniy

vh0rcniy1#

将其放入application.rb或rake任务初始化代码中

if defined?(Rails) && (Rails.env == 'development')
  Rails.logger = Logger.new(STDOUT)
end

Rails 3代码请注意,这将覆盖development.log的日志记录。如果你同时需要STDOUTdevelopment.log,你需要一个 Package 函数。
如果您只希望在Rails控制台中实现这种行为,请将相同的代码块放在~/.irbrc中。

14ifxucb

14ifxucb2#

你可以创建一个新的rake任务来让它工作。

desc "switch logger to stdout"
task :to_stdout => [:environment] do
 Rails.logger = Logger.new(STDOUT)
end

这样,当你执行rake任务时,你可以先添加to_stdout以获取stdout日志消息,或者不包含它以将消息发送到默认日志文件

rake to_stdout some_task
uxhixvfz

uxhixvfz3#

代码

对于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

wmomyfyw

wmomyfyw4#

Rake任务由用户在命令行上运行。他们需要立即知道的任何内容(“已处理的5行”)都应该在终端上用puts输出。
任何需要为子孙后代保留的内容(“发送警告电子邮件到email protected(https://stackoverflow.com/cdn-cgi/l/email-protection)”)都应该发送到Rails.logger

eanckbw9

eanckbw95#

我认为使用Rails.logger.info是正确的选择。
您将无法在服务器控制台中看到它,因为它不会通过服务器运行。只要打开一个新的控制台和tail -f的日志文件,它会做的伎俩。
许多用户都知道UNIX®命令“tail”,它可用于显示大文件的最后几行。这对于查看日志文件等非常有用。
在某些情况下,更有用的是'tail'命令的'-f'参数。这会导致tail“跟随"文件的输出。最初,响应将与'tail'本身相同-将显示文件的最后几行。但是,该命令不会返回到提示符,而是继续“跟踪”文件。当额外的行添加到文件中时,它们将显示在终端上。这对于查看日志文件或任何其他可能随时间追加的文件非常有用。键入'人尾'了解更多关于这个和其他尾部选项的细节。
via

kadbb459

kadbb4596#

在Rails 2.X中,将日志重定向到模型中的STDOUT:

ActiveRecord::Base.logger = Logger.new(STDOUT)

要重定向控制器中的记录器,请执行以下操作:

ActionController::Base.logger = Logger.new(STDOUT)
u4dcyp6a

u4dcyp6a7#

使用“&”执行后台作业,并打开脚本/控制台或其他东西。这样,您就可以在同一个窗口中运行多个命令。

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>]
  • 注意 * 当有大量日志输出时,可能会很快变得草率。
hrirmatl

hrirmatl8#

创建一个应用程序助手来检测哪个环境正在运行并做正确的事情怎么样?

def output_debug(info)
   if RAILS_ENV == "development"
      puts info
   else
      logger.info info
   end
end

然后调用output_debug而不是puts或logger.info

jum4pzuy

jum4pzuy9#

@Eric Duminil的回答。我们可以使用rails提供的usex 1 m0n1x钩子,只有在rake任务被调用时才运行代码块,即当服务器或控制台运行时,此块将不会运行。

# config/application.rb
module MyApp
  class Application < Rails::Application

    rake_tasks do
      config.after_initialize do
        Rails.logger.extend(
          ActiveSupport::Logger.broadcast(ActiveSupport::Logger.new(STDOUT))
        )
      end
    end
  end
end

输出量:

cat lib/tasks/logger_test.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

❱ bundle exec rails stdout_and_log:test
HELLO FROM PUTS
HELLO FROM LOGGER

相关问题