heroku 定制Rails记录器的方法

um6iljoc  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(116)

我的Rails应用程序在Heroku中运行;最近,我们将Heroku LOG_LEVEL改为WARN,因为系统日志中充斥着大量不需要的信息Rails.logger.info。
目前,在Heroku我们有这样的:

LOG_LEVEL = WARN

在生产中。rb,仍然是

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

我们没有更改上面的配置,因为如果我们设置了LOG_LEVEL,则优先级是LOG_LEVEL。因此,使用上面的配置,如果我们设置Rails.logger.info "Hello world,",则不会起作用,因为记录器将只处理重要性等于或高于警告的日志。
所以我们尝试了另一种方法。
已创建名为custom_logger.rb的新初始值设定项;我们把

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

然后在任何我们想使用info的地方,我们只需要调用$INFO_LOGGER.info "Hello World,"这个打印
这是一种正确的方法吗,就像使用全局变量一样?

laawzig2

laawzig21#

这是一种正确的方法吗,就像使用全局变量一样?
这个问题可能被认为是基于观点的,所以在我看来我不推荐它。另外,标题中提出的问题是关于自定义日志记录器的,虽然我们可以实现一个自定义日志记录器来简化请求,但我会建议一个更简单的解决方案,它仍然会准确地记录您想要的内容,到当前日志文件,而不需要自定义日志记录器,辅助日志记录器,或任何类型的全局变量。

我的建议:

Rails默认使用ActiveSupport::Logger,它实际上就是一个ruby Logger
如果您总是希望记录一些消息,而不管level如何,则可以使用Logger#unknown
根据Logger类的文档:
级别:
UNKNOWN -应始终记录的未知消息。
记录器编号未知
记录UNKNOWN消息。无论记录程序的级别如何,都将打印此消息。
因此,您可以使用这一点,以您的优势,为您总是想显示的消息,同时仍然避免噪音的标准信息消息:
例如:

Rails.logger.info "Noisy message" # won't show when LOG_LEVEL > INFO 
Rails.logger.unknown "VERY IMPORTANT MESSAGE" # will show no matter what the level is set to
of1yzvn4

of1yzvn42#

你不想使用全局变量。

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_LEVEL还是config.log_level = :info

相关问题