2016-05-13 56 views
1

我只想在日誌中看到CREATE/UPDATE/DESTROY相關的sql語句。我不希望在日誌中顯示任何與READ相關的語句,緩存或任何其他信息,因爲它會使篩選變得困難。Rails日誌:只顯示創建,更新和銷燬日誌中的SQL語句,而沒有其他東西

目前內app/config/environments/production.rb我有以下的配置集,顯示了太多的日誌:

config.log_level = :debug 

生產的默認配置顯示的信息太少。它忽略了所有的SQL語句,我想看看:

# shows too little information 
config.log_level = :info 

是否有軌道的配置設置可以使日誌只輸出我想看到的信息?如果沒有,我該怎麼做?

+0

閱讀:http://guides.rubyonrails.org/debugging_rails_applications.html#log-levels – uday

+0

@uDaY感謝。我讀過這個。目前看來,目前我所尋找的日誌級別不存在,並且似乎對如何實現自定義日誌級別沒有太多指導。 – Neil

+1

您可以將日誌級別設置爲':info'並訂閱['sql.active_record'](http://edgeguides.rubyonrails.org/active_support_instrumentation.html#sql-active-record)事件並將所有手動事件發送到不以'SELECT'開始的日誌... – spickermann

回答

1

通過將log_level設置爲:info,可以禁用對ActiveRecord數據庫查詢的日誌記錄。

然後使用Rails的ActiveSupport::Instrumentation並訂閱sql.active_record事件。

只需添加以下代碼到一個初始化:

# in `config/initializers/query_logger.rb` 
class QueryLogger 
    def call(name, started, finished, unique_id, payload) 
    query = payload[:sql] 

    Rails.logger.info("SQL Query: #{query}") unless query.start_with?('SELECT') 
    end 
end 

ActiveSupport::Notifications.subscribe('sql.active_record', QueryLogger.new) 
+0

太棒了!謝謝! – Neil

+0

這很好。我希望它做的唯一事情就是顯示SQL查詢語句中的值。這個實現目前不這樣做。關於如何使這項工作的任何提示將會很棒。使用此設置的SQL日誌語句示例:'Info - :SQL Query:UPDATE「blogs」SET「name」=?,「age」=?,「updated_at」=? WHERE「blogs」。「id」=?'所以請注意它如何不顯示'name','age','updated_at'' blogs.id'值。如果有的話,這將是完美的。 – Neil

+1

在[文檔](http://edgeguides.rubyonrails.org/active_support_instrumentation.html#sql-active-record)中,您可以看到有效負載不僅返回'sql',還返回'name','id '和'綁定'(綁定)。我沒有測試它,但如果你在'binds'中發現了這些信息,我會感到非常驚訝。您可能也想嘗試記錄這些值。 – spickermann