[ruby-on-rails] 레일 레이크 작업에 넣기 대 로거

레이크 작업에서 puts 명령을 사용하면 콘솔에 출력이 표시됩니다. 그러나 앱이 프로덕션에 배포 될 때 로그 파일에 해당 메시지가 표시되지 않습니다.

그러나 Rails.logger.info라고 말하면 개발 모드에서 콘솔에 아무것도 표시되지 않습니다. 로그 파일로 이동하여 추적해야합니다.

이상적으로는 Rails.logger.info를 사용하고 rake 작업 내부의 개발 모드에서 logger의 출력도 콘솔로 보내야합니다.

그것을 달성하는 방법이 있습니까?



답변

이것을 application.rb, 또는 레이크 작업 초기화 코드에 넣으십시오.

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

이것은 Rails 3 코드입니다. 이것은에 대한 로깅을 재정의합니다 development.log. 당신이 모두를 원하는 경우 STDOUTdevelopment.log당신은 래퍼 함수가 필요합니다.

Rails 콘솔에서만이 동작을 원하면 동일한 코드 블록을 ~/.irbrc.


답변

이 작업을 수행하기 위해 새로운 레이크 작업을 만들 수 있습니다.

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

이런 식으로 레이크 작업을 실행할 때 먼저 to_stdout을 추가하여 stdout 로그 메시지를 받거나 기본 로그 파일에 메시지를 보내도록 포함하지 않을 수 있습니다.

rake to_stdout some_task


답변

레이크 작업은 사용자가 명령 줄에서 실행합니다. 즉시 알아야 할 모든 것 ( “처리 된 5 개 행”)은 터미널에 puts.

나중에 보관해야하는 모든 항목 ( “jsmith@example.com으로 경고 이메일을 보냄”)은 Rails.logger.


답변

나는 사용 Rails.logger.info이 갈 길이 라고 말하고 싶습니다 .

서버를 통해 실행되지 않기 때문에 서버 콘솔에서 볼 수 없습니다. 새 콘솔과 tail -f로그 파일을 열기 만하면 됩니다.

많은 사용자가 큰 파일의 마지막 몇 줄을 표시하는 데 사용할 수있는 UNIX® 명령 ‘tail’을 알고 있습니다. 이것은 로그 파일 등을 보는 데 유용 할 수 있습니다.

일부 상황에서 훨씬 더 유용한 것은 ‘tail’명령에 대한 ‘-f’매개 변수입니다. 이로 인해 tail이 파일의 출력을 ‘따라’게됩니다. 처음에 응답은 자체적으로 ‘꼬리’에 대한 것과 동일합니다. 파일의 마지막 몇 줄이 표시됩니다. 그러나 명령은 프롬프트로 돌아 가지 않고 대신 파일을 계속 ‘따라갑니다’. 파일에 추가 줄이 추가되면 터미널에 표시됩니다. 이것은 로그 파일이나 시간이 지남에 따라 추가 될 수있는 다른 파일을 보는 데 매우 유용합니다. 이것과 다른 꼬리 옵션에 대한 자세한 내용을 보려면 ‘man tail’을 입력하십시오.

( 경유 )


답변

암호

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.


답변

실행중인 환경을 감지하고 올바른 작업을 수행하는 애플리케이션 도우미를 만드는 것은 어떻습니까?

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

그런 다음 puts 또는 logger.info 대신 output_debug를 호출하십시오.


답변

Rails 2.X에서 로거를 모델의 STDOUT으로 리디렉션합니다.

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

컨트롤러에서 로거를 리디렉션하려면 :

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