3

現在、以下のみがログに記録されていますlogs/delayed_job.log

2012-04-20T03:57:44+0000: Cacher completed after 5.3676
2012-04-20T03:57:44+0000: 1 jobs processed at 0.1744 j/s, 0 failed ...

私がやろうとしているのputsは、開発モードの場合と同じように、SQLクエリだけでなくすべてのクエリもログに記録するようにすることlog/delayed_job.logです。

私は以下を追加しようとしましたinitializers/delayed_job_config.rbが、運がありませんでした:

Delayed::Worker.logger = Rails.logger
Delayed::Worker.logger.level = Logger::DEBUG

(すべてputsがログに記録されますが、ジョブステータスログはなく、SQLクエリもありません)

4

4 に答える 4

8

Rails v3.2.13では、次のことができます。

Delayed::Worker.logger = ActiveSupport::Logger.new("log/delayed_job.log", Rails.logger.level)
Delayed::Worker.logger.auto_flushing = 1

#only reassign AR logger if we're in a delayed process(rake task or script/delayed_job)
if caller.last =~ /script\/delayed_job/ or (File.basename($0) == "rake" and ARGV[0] =~ /jobs\:work/)
  ActiveRecord::Base.logger = Delayed::Worker.logger
end

しかし...ActiveSupport::BufferedLoggerは非推奨になりましたhttps://github.com/rails/rails/blob/master/activesupport/lib/active_support/buffered_logger.rb#L18

さらに、ログを正しくローテーションしたいと思うかもしれません。だからこれは私が思うより良いです:

Delayed::Worker.logger = Logger.new("log/delayed_job.log", 5, 104857600)

if caller.last =~ /script\/delayed_job/ or (File.basename($0) == "rake" and ARGV[0] =~ /jobs\:work/)
  ActiveRecord::Base.logger = Delayed::Worker.logger
end

コンストラクターによると、約5つのログファイルを保持し、現在のログファイルが100Mbに達したときにローテーションします。詳細については、こちらをご覧ください: http ://www.ruby-doc.org/stdlib-1.9.3/libdoc/logger/rdoc/Logger.html#method-c-new

クレジット:http ://www.heedspin.com/2011/01/17/delayed-job-logging.html インスピレーション

于 2013-05-10T04:16:17.707 に答える
3

多分このリンクはあなたに役立ちます:https ://stackoverflow.com/a/7223681/445908

更新:プットについてもう少し。vsロガー:

「puts」の結果をログファイルに保存するための実装が何であるかわかりません。ただし、常に「puts」ではなく「logger」を使用するがはるかに良い選択だと思います。理由は次のとおりです。

  1. ほとんどの場合、putsパフォーマンスが低下する可能性があります(特に、本番環境では、過去のすべてのプロジェクトputsで、ソースコードに表示することは許可されていません)(Javaプログラマーの場合System.out.printlnは同じです)

  2. loggerデバッグ、情報、警告、エラー、致命的の5つのデフォルトレベルがあるため、常にを使用します。これらは、などのツールによって制御および美しくフォーマットおよびフィルタリングできますgrep。たとえばputs、以下のログ情報を生成できますか?

    07:27:48 INFO: in device_resource, options: queryem??ltres67@blur.com 
    07:27:48 INFO: cloudset: ??100 
    
于 2012-04-20T05:03:17.993 に答える
3

これはOPにとって少し遅れるかもしれませんが、別のアプローチがあります。DelayedJobプラグインを使用して、ワーカーに割り当てられたロガーからRails(およびActiveRecord :: Base)ロガーを設定します。

2つのステップ:遅延ジョブ初期化子で、次の手順を実行します。

require 'delayed_job_log_setup'
Delayed::Worker.plugins << DelayedJobLogSetup

プラグイン自体(私は明らかにlib / delayd_job_log_setup.rbに入れました):

require 'delayed_job'

class DelayedJobLogSetup < Delayed::Plugin
  callbacks do |lifecycle|
    lifecycle.before(:execute) do |worker|
      Rails.logger = worker.logger
      ActiveRecord::Base.logger = worker.logger
    end
  end
end

残念ながら、Object#puts(プラグイン内で)ロガーを直接呼び出すためにモンキーパッチを適用しようとしても、OPが望んでいたことは実行されません。

于 2014-10-28T01:57:00.643 に答える
0

これを行う別の方法はscript/delayed_job、Railsアプリケーションのファイルで必要なログファイル構成を行うことです。私のは今このように見えます、

#!/usr/bin/env ruby

require File.expand_path(File.join(File.dirname(__FILE__), '..', 'config', 'environment'))
require 'delayed/command'

# This was added to make sure the DJ log has the same log level 
# as the rails app, and to ensure ActiveRecord uses the same log 
# when loaded inside a DJ worker process.
#
Delayed::Worker.logger ||= Logger.new(File.join(Rails.root, 'log', 'delayed_job.log'), Rails.configuration.log_level)
ActiveRecord::Base.logger = Delayed::Worker.logger

Delayed::Command.new(ARGV).daemonize

このアプローチで何が起こっているのかは非常にシンプルで明確です。

さらに重要なことは、ワーカープロセスの遅延を伴わないシナリオでARロガーを台無しにするリスクがないことです。これは、他のいくつかの回答と同様の異なるアプローチで私たちに起こり、多くの頭痛と混乱を引き起こしました。

于 2015-02-14T01:08:21.610 に答える