【问题标题】:How do I disable logging for a rake task?如何禁用 rake 任务的日志记录?
【发布时间】:2011-04-25 22:22:38
【问题描述】:

我有一个 rake 任务,它每天作为 cron 作业运行一次。它对当前包含 57k+ 条记录的模型执行一些维护。每次针对当前所处的环境运行任务时,这都会在日志中添加数十万行。(目前它只是在开发中。)

如何禁用特定 rake 任务或任务组的日志记录,但不为应用程序的其余部分单独记录日志,而对于从任务调用的模型/方法不单独记录?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 rake


    【解决方案1】:

    Rails 记录器是一个ActiveSupport::BufferedLogger 对象,但可以根据需要重新分配给任何其他类型的Logger 对象(或任何响应Logger 方法的对象),包括以下内容:

    dev_null = Logger.new("/dev/null")
    Rails.logger = dev_null
    ActiveRecord::Base.logger = dev_null
    

    将这些行放在您的 Rake 任务的顶部,所有日志记录输出都会以低廉的成本发送到 /dev/null,这在其 Wikipedia 文章中得到了最好的解释。

    【讨论】:

    • 即使将该行作为每个任务的第一行,Rails 也会为它加载的每条记录添加一行,例如照片加载 (34.0ms) SELECT image_id FROM photos WHERE (photos.album_id = 16616519)
    • @Preacher:在这里我认为 Rails 会足够聪明,可以提供一个位置来为整个应用程序设置记录器实例。傻我。用更好的解决方案更新了答案。
    • 这行得通。有没有机会解释一下这是做什么的?
    • @Preacher:我认为这个问题清楚地解释了它现在在做什么。 /dev/null 是一个可以写入但实际上并没有写入任何地方的位置,数据被丢弃。
    • 使用“/dev/null”效率低下(仍然格式化和写入文件)。 Logger.new(nil) 工作正常。
    【解决方案2】:

    您可以将其添加到任务的顶部:

    ActiveRecord::Base.logger.level = 2
    

    【讨论】:

    • 仅供参考:沉默已被弃用,将从 Rails 4.0 中删除
    【解决方案3】:

    如果你有一个 cron 作业,你可以将输出重定向到 /dev/null 像:

    * * * * * rake whatever_task_blah_blah > /dev/null 2>&1
    

    【讨论】:

    • 我得到的结果与其他答案相同。
    • 这只会将 OUTPUT 传送到 /dev/null,而不是记录器输出。
    • 同意。不过,他没有提到他真正想要管道的内容。这就是为什么 cron 是可能的原因。
    【解决方案4】:

    另一种可能性是有一个正在检查环境变量的配置

    # production.rb
    
    Rails.application.configure do
      #...
      config.log_level = ENV["RAILS_LOG_LEVEL"].presence || :debug # default level
    
    end
    

    然后你可以运行任何你想要的级别前缀

    $> RAILS_LOG_LEVEL=info bin/rake my:rake:task
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      • 2020-01-17
      • 2016-07-04
      • 2021-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多