现在只有以下内容记录到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
。< / p>
我尝试将以下内容添加到initializers/delayed_job_config.rb
,但没有运气:
Delayed::Worker.logger = Rails.logger
Delayed::Worker.logger.level = Logger::DEBUG
(我的所有puts
现在都被记录,但没有更多的作业状态日志,仍然没有SQL查询)
答案 0 :(得分: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 为灵感
答案 1 :(得分:3)
也许这个链接对您有帮助:https://stackoverflow.com/a/7223681/445908
更新:更多关于看跌期权。 v.slogger:
我不确定将“put”结果存储到日志文件中的实现方式。但是我觉得总是使用“logger”代替“puts”可能是一个更好的选择。原因是:
在大多数情况下,puts
可能会降低您的效果(特别是在生产环境中,在我之前的所有项目中,puts
都不允许出现在源代码中) (对于java程序员,System.out.println
是相同的东西)
始终使用logger
,因为它有5个默认级别:debug,info,warn,error,fatal,它们可以通过grep
等工具进行控制和精美格式化和过滤。例如可以puts
生成下面的日志信息吗?
07:27:48 INFO: in device_resource, options: queryem??ltres67@blur.com
07:27:48 INFO: cloudset: ??100
答案 2 :(得分:3)
对于OP来说这可能有点晚了,但这是一种不同的方法:使用DelayedJob插件设置Rails(和ActiveRecord :: Base)记录器来自分配给Worker的记录器。
两个步骤:在延迟作业初始化程序中,执行:
require 'delayed_job_log_setup'
Delayed::Worker.plugins << DelayedJobLogSetup
插件本身(我显然放在lib / delayed_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想要的事情。
答案 3 :(得分:0)
另一种方法是在rails应用程序的script/delayed_job
文件中进行必要的日志文件配置。我现在看起来像这样,
#!/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记录器的风险。这种情况发生在我们身上,采用了与其他一些答案相似的不同方法,引起了许多令人头疼和困惑。