puts vs logger in rails rake tasks

后端 未结 8 1528
情书的邮戳
情书的邮戳 2021-01-30 06:24

In a rake task if I use puts command then I see the output on console. However I will not see that message in log file when app is deployed on production.

However if I s

相关标签:
8条回答
  • 2021-01-30 06:27

    In Rails 2.X to redirect the logger to STDOUT in models:

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

    To redirect logger in controllers:

    ActionController::Base.logger = Logger.new(STDOUT)
    
    0 讨论(0)
  • 2021-01-30 06:29

    How about creating an application helper which detects which environment is running and does the right thing?

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

    Then call output_debug instead of puts or logger.info

    0 讨论(0)
  • 2021-01-30 06:30

    Execute a background job with '&' and open script/console or whatever.. That way you can run multiple commands in the same window.

    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 Can get sloppy quickly when there is a lot of logging output.

    0 讨论(0)
  • 2021-01-30 06:34

    Rake tasks are run by a user, on a command-line. Anything they need to know right away ("processed 5 rows") should be output on the terminal with puts.

    Anything that needs to be kept for posterity ("sent warning email to jsmith@example.com") should be sent to the Rails.logger.

    0 讨论(0)
  • 2021-01-30 06:36

    Put this in application.rb, or in a rake task initialize code

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

    This is Rails 3 code. Note that this will override logging to development.log. If you want both STDOUT and development.log you'll need a wrapper function.

    If you'd like this behaviour only in the Rails console, place the same block of code in your ~/.irbrc.

    0 讨论(0)
  • 2021-01-30 06:40

    You could create a new rake task to get this to work.

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

    This way when you execute your rake task you can add to_stdout first to get stdout log messages or don't include it to have messages sent to the default log file

    rake to_stdout some_task
    
    0 讨论(0)
提交回复
热议问题