레일 레이크 작업에 넣기 대 로거


108

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

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

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

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

답변:


57

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

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

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

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


26
Rails.logger = Logger.new(STDOUT)development.rb에 넣는 것이 더 쉽지 않을까요 ?
ghempton

레일 2의 경우 development.rb에 다음을 입력하십시오.config.logger = Logger.new(STDOUT)
jsarma

38

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

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

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

rake to_stdout some_task

11

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

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


17
cron으로 rake 작업을 실행하는 것은 드문 일이 아닙니다.
Johannes Gorset 2013 년

2
진실. 크론 작업이 완료 될 때 로그 메시지를 이메일로 보내려면 $ stdout 또는 $ stderr로 보내십시오.
Jonathan Julian

10

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

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

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

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

( 경유 )


그러나 작업을 호출 한 동일한 창에 출력이 표시되지 않기 때문에 로컬 컴퓨터에서 작업하는 동안별로 불편하지 않습니다. 특히 여러 창을 나란히 놓을 수있는 큰 화면이없는 경우.
Tomas Markauskas 2010

10
더 좋은 방법은 tailf"tail -f와 비슷하지만 파일이 커지지 않을 때는 파일에 액세스하지 않습니다"(맨 페이지에서)를 사용하는 것입니다. 너무 짧습니다
MBO

@tomas 서버 로그 콘솔을 최소화하지 않고 tail-f가 실행되는 하나의 콘솔 만 가지고있는 이유는 무엇입니까? 어쨌든 그것은 진짜 문제가 아닙니다 ... 나는 내 앱에서 무슨 일이 일어나고 있는지 추적하는 8 개의 콘솔처럼 실행하고 있습니다. 시스템의 특정 부분에서 작업 할 때 탭 사이를 전환하기 만하면됩니다. 큰 문제가 아닙니다. imho
marcgg

@mbo nice :) halas 내 컴퓨터에서 사용할 수없는 것 같습니다 (mac os @ leopard)
marcgg

1
@marcgg : "서버 콘솔"은 없지만 (승객을 사용합니다) 문제는 레이크 작업에 관한 것이며 한 터미널 창에서 작업을 실행하면 해당 창에서 로거에서 아무것도 볼 수 없습니다. 출력을 보려면 development.log가있는 다른 창이 있어야합니다. 이상적으로는 Rails.logger에 다른 출력 스트림으로 stdout을 추가하지만 원본을 제거하지는 않습니다.
Tomas Markauskas 2010

9

암호

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.


Rails 5에서는 명령 자체가 실행 basename($0) == 'rake'되기 때문에 트릭이 더 이상 작동하지 않습니다 . .NET Framework를 설정하는 작업에 의존하는 것 이상의 좋은 대체품을 찾고 싶습니다 . (그 부분은, 적어도, 여전히 잘 작동합니다.)railsrakebroadcast
브렌트 로얄 - 고든

BrentRoyal - 고든 @ 개발이 조건에 대한 필요가 없습니다, 당신은 단지에 코드를 추가 할 수 있습니다 Rakefile프로젝트의 루트에
마우 Pasquier 후안

4

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

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

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


5
나는 이것이 좋은 생각이라고 생각하지 않습니다. Rails 로거는 구성 가능하도록되어 있지만 구성 가능성을 사용하는 대신 여기에 더 많은 레이어를 쌓는 것입니다.
Sijmen Mulder 2011

예, 무언가를 기록하려고 할 때마다 동일한 검사가 수행되기 때문에 좋은 생각이 아닙니다 .
furiabhavesh


2

'&'를 사용하여 백그라운드 작업을 실행하고 스크립트 / 콘솔 등을 엽니 다. 이렇게하면 동일한 창에서 여러 명령을 실행할 수 있습니다.

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 로깅 출력이 많으면 빠르게 엉망이 될 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.