production.log
に大量の UPDATE
クエリが記録されてログファイル汚染で「ウッ!」となるやつを回避する。
どうする
以下は production 想定のログファイルだけど、他の実ファイルと重複しなければなんでもよい。 このへんを参考にしました。
config/environments/production.rb
Rails.application.configure do
の中のどっかに書く。
if caller_locations.map(&:path).any? { |c| c =~ %r{bin\/delayed_job} } ActiveRecord::Base.logger = Logger.new(Rails.root.join('log', 'delayed_job.production.log')) end
ログ出力を抑制してしまう
以下のようにすると、そも出力しないようにできる。 しかし本来出るはずのものを抑制していいのか? という疑問があったので、こちらのチャートは採用を見送りました。
config/initializers/delayed_job.rb
unless Rails.env.development? module Delayed module Backend module ActiveRecord class Job class << self alias_method :reserve_original, :reserve def reserve(worker, max_run_time = Worker.max_run_time) previous_level = ::ActiveRecord::Base.logger.level ::ActiveRecord::Base.logger.level = Logger::WARN if previous_level < Logger::WARN value = reserve_original(worker, max_run_time) ::ActiveRecord::Base.logger.level = previous_level value end end end end end end end
注意
delayed_job を出力するログファイルを作る場合、こいつのログローテートと、ローテート時ファイルポインタ開放してやらないといけない。 僕は現状、 logrotate で以下のように truncate で運用するようにしています。 ちゃんとやるなら、 deamon 化を systemctl に任せたりとかしないといけない気がしてる。
/etc/logrotate.d/rails
/var/www/PROJECT/current/log/*.log { su ec2-user ec2-user #create 664 ec2-user ec2-user daily missingok rotate 90 compress delaycompress dateext notifempty copytruncate }