Log rails console always to file in production env

BvuRVKyUVlViVIc7

As you maybe know by yourself, sometimes you have to do tasks on a live production machine, via the rails console...

I usually start it with: bundle exec rails console -e production

But since its the production machine, I would like to log all in+outputs of the rails console to a file, f.e. to /home/sshuser/myproject/console_sessions/2016_09_09__14_33_33.txt

Anybody knows how to do this? I would like to start the logger atuomatically, but only if I run the console?

(I'm running Rails 3.2) Thanks!

Eric Duminil

Here's a solution with only one file for a whole system, no modification to your Rails projects and no modification to your console command.

You can put this in your ~/.irbrc, I tested it with Ruby 2.1.5 and Rails 3.2/4.0/4.2 :

# ~/.irbrc for http://stackoverflow.com/questions/39411783/log-rails-console-always-to-file-in-production-env
if defined? Rails
  puts "Loading configuration for Rails console from #{__FILE__}"
  time = Time.now.strftime('%Y_%m_%d__%H_%M_%S')
  log_file = File.join(Rails.root, "log", "rails_console_#{Rails.env}_#{time}.log")
  #log_file = "/home/sshuser/myproject/console_sessions/#{time}.txt"
  puts "  logging to #{log_file}"
  logger = Logger.new(log_file)
  Rails.logger = logger
  ActiveRecord::Base.logger = logger if defined? ActiveRecord

  # Intercepts STDIN from IRB
  module Readline
    module History
      def self.write_log(line)
        Rails.logger.info(line)
      end

      def self.start_session_log
        write_log("# session start: #{Time.now}")
        at_exit { write_log(" # session stop: #{Time.now}") }
      end
    end

    alias :old_readline :readline
    def readline(*args)
      ln = old_readline(*args)
      begin
        History.write_log("STDIN : #{ln}")
      rescue
      end
      ln
    end
  end

  # $stdout writes to STDOUT and Rails.logger
  # $stderr writes to STDERR and Rails.logger
  class MultiLog
    def initialize(io)
      @io = io
      @desc = io.inspect[/STD\w+/]
    end

    def write(str)
      Rails.logger.info("#{@desc} : #{str}")
      @io.write(str)
    end

    def close
      @io.close
    end
  end

  $stdout = MultiLog.new(STDOUT)
  $stderr = MultiLog.new(STDERR)

  Readline::History.start_session_log
end

For Pry, you should use this ~/.pryrc :

# ~/.pryrc for http://stackoverflow.com/questions/39411783/log-rails-console-always-to-file-in-production-env

if defined? Rails
  puts "Loading configuration for Rails console from #{__FILE__}"
  time = Time.now.strftime('%Y_%m_%d__%H_%M_%S')
  log_file = File.join(Rails.root, "log", "rails_console_#{Rails.env}_#{time}.log")
  #log_file = "/home/sshuser/myproject/console_sessions/#{time}.txt"
  puts "  logging to #{log_file}"
  logger = Logger.new(log_file)
  Rails.logger = logger
  ActiveRecord::Base.logger = logger if defined? ActiveRecord

  # Intercepts STDIN from pry (from http://www.hardscrabble.net/2015/how-to-log-all-input-in-your-pry-rails-console)
  class LoggingReadline
    delegate :completion_proc, :completion_proc=, to: Readline

    def readline(prompt)
      Readline.readline(prompt).tap do |user_input|
        Rails.logger.info("STDIN : #{user_input}")
      end
    end
  end

  Pry.config.input = LoggingReadline.new

  # $stdout writes to STDOUT and Rails.logger
  # $stderr writes to STDERR and Rails.logger
  class MultiLog
    # Needed for #tty?, #flush : https://github.com/pry/pry/issues/1464
    def method_missing(sym,*p)
      @io.send(sym,*p)
    end

    def initialize(io)
      @io = io
      @desc = io.inspect[/STD\w+/]
    end

    def write(str)
      Rails.logger.info("#{@desc} : #{str}")
      @io.write(str)
    end

    alias_method :print, :write
  end

  $stdout = MultiLog.new(STDOUT)
  $stderr = MultiLog.new(STDERR)

end

It saves console input, output and errors, as well as database queries into the specified file. For example :

 ~/www/my_movies> bundle exec rails console -e development                                                                  
Loading development environment (Rails 4.0.4)
Loading configuration for Rails console from /home/ricou/.irbrc
  logging to /home/ricou/www/my_movies/log/rails_console_development_2016_10_28__11_58_41.log
2.1.5 :001 > Movie.first
 => Est - Ouest 
2.1.5 :002 > puts 2+2
4
 => nil 
2.1.5 :003 > exit

outputs this log file :

# Logfile created on 2016-10-28 11:58:41 +0200 by logger.rb/44203
I, [2016-10-28T11:58:41.062811 #3860]  INFO -- : # session start: 2016-10-28 11:58:41 +0200
I, [2016-10-28T11:58:46.822753 #3860]  INFO -- : STDIN : Movie.first
D, [2016-10-28T11:58:46.883974 #3860] DEBUG -- :   Movie Load (0.7ms)  SELECT "movies".* FROM "movies" ORDER BY "movies"."id" ASC LIMIT 1
I, [2016-10-28T11:58:46.896787 #3860]  INFO -- : STDOUT :  => Est - Ouest 

I, [2016-10-28T11:58:48.922083 #3860]  INFO -- : STDIN : puts 2+2
I, [2016-10-28T11:58:48.922486 #3860]  INFO -- : STDOUT : 4
I, [2016-10-28T11:58:48.922524 #3860]  INFO -- : STDOUT : 

I, [2016-10-28T11:58:48.922584 #3860]  INFO -- : STDOUT :  => nil 

I, [2016-10-28T11:58:50.341326 #3860]  INFO -- : STDIN : exit
I, [2016-10-28T11:58:50.342142 #3860]  INFO -- :  # session stop: 2016-10-28 11:58:50 +0200

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

From Dev

ENV variables only available in production console, not in app -- Rails, Figaro Gem

From Javascript

Override console.log(); for production

From Dev

Disabling console.log() in production

From Dev

dotenv requires .env file on production

From Dev

rails console starting in production error

From Dev

if(process.env.NODE_ENV === 'production') always false

From

Ruby on Rails production log rotation

From Java

Rails: Can't start the rails console in production

From Dev

Precompiling assets with Rails_Env set as production

From Dev

jquery doesn't execute in rails production env

From Dev

Phoenix equivalent of Rails.env.production?

From Dev

EnvironmentMismatchError - Rails.env being set to "production"

From Dev

How to remove console.log from production?

From Dev

Change console.log() for production deployments?

From Dev

Nodejs not writting to log file in production

From Dev

How to log to file and to console

From Dev

log/production.log file exists but is empty

From

Rails console in production: NameError: uninitialized constant

From Dev

Rails 4: Show SQL in console in production

From Dev

Cannot start rails 4 console on production server

From Dev

Rails Capistrano 3 - how to share production.log file into the shared folder of Capistrano?

From Dev

Do we get production.log file while running in product mode from local in rails?

From Dev

Console.log always returns undefined in Chrome

From

Node: log in a file instead of the console

From

Writing outputs to log file and console

From Dev

django - outputting console to log file

From Dev

How to configure RSPEC to never run on RAILS_ENV production

From Dev

Cannot access :development or :production credentials with [Rails.env]

From Dev

Would Rails' production.log log an HTTP 408 request?

Related Related

  1. 1

    ENV variables only available in production console, not in app -- Rails, Figaro Gem

  2. 2

    Override console.log(); for production

  3. 3

    Disabling console.log() in production

  4. 4

    dotenv requires .env file on production

  5. 5

    rails console starting in production error

  6. 6

    if(process.env.NODE_ENV === 'production') always false

  7. 7

    Ruby on Rails production log rotation

  8. 8

    Rails: Can't start the rails console in production

  9. 9

    Precompiling assets with Rails_Env set as production

  10. 10

    jquery doesn't execute in rails production env

  11. 11

    Phoenix equivalent of Rails.env.production?

  12. 12

    EnvironmentMismatchError - Rails.env being set to "production"

  13. 13

    How to remove console.log from production?

  14. 14

    Change console.log() for production deployments?

  15. 15

    Nodejs not writting to log file in production

  16. 16

    How to log to file and to console

  17. 17

    log/production.log file exists but is empty

  18. 18

    Rails console in production: NameError: uninitialized constant

  19. 19

    Rails 4: Show SQL in console in production

  20. 20

    Cannot start rails 4 console on production server

  21. 21

    Rails Capistrano 3 - how to share production.log file into the shared folder of Capistrano?

  22. 22

    Do we get production.log file while running in product mode from local in rails?

  23. 23

    Console.log always returns undefined in Chrome

  24. 24

    Node: log in a file instead of the console

  25. 25

    Writing outputs to log file and console

  26. 26

    django - outputting console to log file

  27. 27

    How to configure RSPEC to never run on RAILS_ENV production

  28. 28

    Cannot access :development or :production credentials with [Rails.env]

  29. 29

    Would Rails' production.log log an HTTP 408 request?

HotTag

Archive