콘솔에서 Rails SQL 로깅 비활성화


262

콘솔에서 명령을 실행할 때 SQL 쿼리 로깅을 비활성화하는 방법이 있습니까? 콘솔에서 명령을 사용하여 비활성화하고 다시 활성화 할 수 있다면 이상적입니다.

무언가를 디버깅하고 "puts"를 사용하여 관련 데이터를 인쇄하려고합니다. 그러나 SQL 쿼리 출력으로 인해 읽기가 어렵습니다.


편집 : 내 코드 이외의 것이 logger를 호출하려고 시도하면 로거를 nil로 설정하면 오류가 발생하기 때문에 다른 해결책을 찾았습니다.

로거를 설정하는 대신 로거 nil레벨을로 설정할 수 있습니다 1.

ActiveRecord::Base.logger.level = 1 # or Logger::INFO

since setting the logger to nil sometimes raised an error얍 .. 나는 실행하려고이 하나 있어요 rake db:migrate stackoverflow.com/questions/1719212/...
— abbood

3
이니셜 라이저의 Rails 4.1.0에서 작동하는지 확인하십시오.
— Amal Chaudhuri 2016 년

답변:


314

끄려면 :

old_logger = ActiveRecord::Base.logger
ActiveRecord::Base.logger = nil

다시 켜려면 :

ActiveRecord::Base.logger = old_logger

1
SQL 출력을 영구적으로 비활성화하기 위해 이것을 넣을 수있는 곳이 있습니까? envs / dev.rb에 추가하려고 시도했지만 운이 없습니다.
— samvermette

5
이 코드를 .irbrc기본적으로 .bashrcRails 콘솔 용 으로 넣을 수 있습니다 . 실제로 .irbrc원하는 경우 구문 채색, 히스토리, vi에서 코드를 편집 한 후 Rails 콘솔에서 실행하는 등 원하는 모든 작업을 수행 할 수 있습니다 . utility_beltRuby 1.8 또는 Ruby 1.9 포트에있는 경우 내 gem을 확인하십시오. 전화flyrb
— Giles Bowkett

2
@giles bowkett : 사실 루비 인터랙티브 커맨드 라인 .irbrc과 비슷 .bashrc하지만 실제로 는 마찬가지 입니다. 난간이 아닙니다. 레일 환경 밖에서 irb를 실행할 때 레일 클래스를 참조하려고하면 아마도 오류가 발생한다고 생각합니다.
— eremzeit

9
@samvermette 구성 파일에서 할 수 있습니다. 예 :config/initializers/activerecord_logger.rb
— Uri

15
ActiveRecord::Base.logger.level = 1.info 및 기타를 사용하면 예외가 발생하지 않으므로 훨씬 더 나은 대답입니다.
— Dirty Henry

72

AR에서 잠재적으로 다른 로깅을 허용하는 다소 깨끗한 것으로 생각되는 변형이 있습니다. config / environments / development.rb에서 :

config.after_initialize do
  ActiveRecord::Base.logger = Rails.logger.clone
  ActiveRecord::Base.logger.level = Logger::INFO
end

Rails 3.0 또는 3.1에서는 홀수가 아닙니다. 왜 Rails.logger가 after_initialize 블록에 없는가, Rails init 스택을 커스터마이즈하기 위해 다른 작업을 수행했거나 config.after_initialize?
— jrochkind

1
Rails 3.1 앱에서 잘 작동합니다. Seemsl은 가장 좋은 해결책을 제시합니다. +1
— Martijn

나를 위해 작동하지 않습니다 ... after_initialize 블록에서 레벨 OK를 설정하지만 콘솔이 열릴 때까지 레벨은 0으로 돌아갑니다. 이상한. (? 내가, 콘솔 교체로 들어 올립니다를 사용하고있어 것을 왜)
— 마이크 블라이스

63

콘솔에 적합한 솔루션은 아니지만 Rails에는이 문제에 대한 방법이 있습니다. Logger # silence

ActiveRecord::Base.logger.silence do
  # the stuff you want to be silenced
end

4
Rails 3까지만 작동합니다 : "
— 감가 상각

6
@ Kangur 난 레일 4.2에있어 침묵은 잘 작동하는 것 같습니다
— Benjamin Crouzier

2
나는 또한이 방법을 확인할 수 있습니다 @Kangur은 레일 4.2에서 잘 작동합니다
— 그렉 마 슬리

6
Rails 5에서 작동하며 경고가 표시되지 않습니다. 이것이 최고의 답변 IMO입니다.
— 오버로드

1
Rails 6에서 잘 작동합니다. 어쩌면 조금 움직였을까요?
— johncip

16

Rails 4의 경우 환경 파일에 다음을 넣을 수 있습니다.

# /config/environments/development.rb

config.active_record.logger = nil

그것은 어쨌든 벌목이 대부분 억압되는 생산에만 적용된다 ....
— Rob

13

누군가가 실제로 로깅 수준을 변경하지 않고 AR 모델에서 로깅을 유지하면서 SQL 문 로깅 을 실제로 중단 하려는 경우 :

로그에 기록하는 행 (어쨌든 Rails 3.2.16에서)은 debugin에 대한 호출 입니다 lib/active_record/log_subscriber.rb:50.

해당 디버그 방법은에 의해 정의됩니다 ActiveSupport::LogSubscriber.

따라서 다음과 같이 덮어 써서 로깅을 중단 할 수 있습니다.

module ActiveSupport
  class LogSubscriber
    def debug(*args, &block)
    end
  end
end

좋아요 이것은 Rails.logger.debug명령문에 영향을주지 않고 SQL 로깅에서 작동 합니다.
— Teemu Leisti 2016 년

멍청한 놈. 정확히 어디에 두어야합니까?
— devius

lib / monkeypatch.rb에 보관하고 config / application.rb에 다음 줄로 레일을 가져옵니다 Dir.glob( "./lib/*.{rb}" ).each{ | file | require file }. 몽키 패칭은 일부 사람들에게 찌그러짐을 명심하십시오. 아마도 이것을 프로덕션 코드로 확인해서는 안됩니다.
— fakeleft

8

나는 이것을 사용했다 : config.log_level = :info 편집config/environments/performance.rb

SQL 출력을 거부하고 렌더링과 중요한 정보 만 표시합니다.


나는 레일 4.1.0을 사용하고 있으며 잘 작동했습니다. 감사합니다
— Zakaria

4

Rails 3.2에서는 config / environment / development.rb에서 다음과 같은 작업을 수행하고 있습니다.

module MyApp
  class Application < Rails::Application
    console do
      ActiveRecord::Base.logger = Logger.new( Rails.root.join("log", "development.log") )
    end
  end
end

2

참고로 Rails 2에서 할 수있는 일

ActiveRecord::Base.silence { <code you don't want to log goes here> }

do end원하는 경우 중괄호를 블록으로 바꿀 수 있습니다 .

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