콘솔에서 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.