【问题标题】:Approach to a custom rails logger自定义 Rails 记录器的方法
【发布时间】:2022-10-15 01:15:24
【问题描述】:

我的 Rails 应用程序在 Heroku 中运行;最近,我们将 Heroku LOG_LEVEL 更改为 WARN,因为系统日志中充斥着大量不需要的信息。但是,在某些领域,我还是想使用 Rails.logger.info;

目前,在 Heroku 中,我们有这个:

LOG_LEVEL = WARN

在production.rb中,仍然是

config.log_level = :info
config.log_formatter = ::Logger::Formatter.new

上面的配置我们没有改变它,因为如果我们设置它,优先级是 LOG_LEVEL。因此,使用上述配置,如果我们输入Rails.logger.info "Hello world,",那将不起作用,因为记录器只会处理等于或更高的日志以警告重要性。

所以我们尝试了另一种方式。

创建了一个名为 custom_logger.rb 的新初始化程序;我们把

$INFO_LOGGER = Rails.logger.dup
$INFO_LOGGER.level = :info

然后在我们想使用信息的任何地方,我们只需调用$INFO_LOGGER.info "Hello World," 这个打印

这是一种正确的方法,比如使用全局变量吗?

【问题讨论】:

    标签: ruby-on-rails heroku logging ruby-on-rails-5


    【解决方案1】:

    您不想使用全局变量。而是创建一个自定义类,例如

    class MyLogger
      class << self 
    
        def info(*args)
          new.info(*args)
        end
      end
    
      delegate :info, to: :logger 
    
      attr_reader :logger
    
      def initialize
        @logger = ActiveSupport::Logger.new(Rails.root.join("log/my_logger.#{Rails.env}.log"))
        @logger.formatter = ::Logger::Formatter.new
      end
    end
    

    现在您可以调用MyLogger.info("this is a test message"),无论LOG_LEVELconfig.log_level = :info,它都会在日志文件中输出消息

    【讨论】:

    • 嗨@Chris,谢谢你,但我有一个问题,这将创建一个名为 log/my_logger.production.log 的新日志文件,对吗?这是正确的方法吗?我们在哪里可以保留这个类,它是在 lib 文件夹下的某个地方吗?
    • 是的,没错,但您也可以登录到production.log,这取决于您。我会把这个类放在app/lib 中,这样它就会被rails自动加载,当你想使用它时不需要它
    【解决方案2】:

    Rails 默认使用ActiveSupport::Logger,它本质上只是一个红宝石Logger

    如果无论level 是什么,您总是希望记录一些消息,您可以使用Logger#unknown

    根据文件:

    记录 UNKNOWN 消息。无论记录器的级别是什么,都会打印出来。

    因此,您可以通过以下方式利用它来发挥自己的优势

    Rails.logger.unknown "Hello world,"
    

    【讨论】:

      猜你喜欢
      • 2013-01-09
      • 2017-12-23
      • 1970-01-01
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-05
      相关资源
      最近更新 更多