【问题标题】:Have delayed_job log "puts", sql queries and jobs status有 delay_job 日志“puts”、sql 查询和作业状态
【发布时间】:2012-05-01 16:14:47
【问题描述】:

目前只有以下内容记录到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 查询)

【问题讨论】:

    标签: ruby-on-rails ruby logging


    【解决方案1】:

    在 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 为了灵感

    【讨论】:

    • 你把这个放在哪里?在初始化程序中?
    • 当然,或者环境文件。
    【解决方案2】:

    也许这个链接对你有帮助:https://stackoverflow.com/a/7223681/445908

    更新:关于puts的更多信息。与记录器:

    我不确定您将“放置”结果存储到日志文件中的实现方式。但是我认为始终使用“logger”而不是“puts”可能是一个更好的选择。原因是:

    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 
      

    【讨论】:

    • 已经尝试了所有 3 种解决方案,但都没有奏效。在所有情况下,log/delayed_job.log 只获取作业状态消息,development.log 获取 sql 查询,但我的puts 无法在哪里看到。
    • 那么你如何记录你的“看跌期权”?也许你应该让delayed_job 知道它是如何工作的。
    • 所以改用logger.info 之类的东西?
    • 感谢您澄清 putslogger。最后使用this code 将我的作业状态消息、SQL 查询以及我的自定义日志消息输出到专用的delayed_job.log 文件。
    【解决方案3】:

    这对于 OP 来说可能有点晚了,但这里有一种不同的方法:使用 DelayedJob 插件来设置分配给 Worker 的 Rails(和 ActiveRecord::Base)记录器。

    两个步骤:在您的延迟作业初始化程序中,执行:

    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 的要求。

    【讨论】:

    • 优秀的答案。这适用于类作业以及使用简单 .delay 的作业。语法。
    【解决方案4】:

    另一种方法是在 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 记录器的风险。这发生在我们身上,采用与其他一些答案类似的不同方法,并引起了许多头痛和困惑。

    【讨论】:

    • 出于某种原因,在乘客独立的 AWS Elastic Beanstalk 下使用 Rails 3.2.16,这会创建一个新的、空的、编号的日志文件,其中每五秒(每次守护程序运行时)包含一个 SQL 查询。看起来它在停止或重新开始之前达到了 100 个文件。另外,看起来 log_level 不能在 'Logger.new` 方法中设置。
    • @MarkBerry 听起来您在此代码之外运行了某种日志轮换组件?我不熟悉 AWS Elastic Beanstalk,因此无法真正评论它可能引入的内容。
    • 我不认为这与日志轮换有关,因为轮换的日志进入了一个子目录。就好像有什么东西导致它创建一个新文件(每五秒)而不是覆盖一个旧文件。我认为这与在脚本文件中包含此代码而不是初始化程序有关。您是否在生产中使用此代码?在初始化程序中设置日志时,我的运气更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    • 2010-09-12
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 2011-05-19
    • 2018-07-27
    相关资源
    最近更新 更多