自定义轨道记录器的方法



My 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,那么它的优先级是。因此,在上面的配置中,如果我们放置Rails.logger.info "Hello world,",它将不起作用,因为记录器将只处理同等或更高的日志,以发出重要警告。

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

创建了一个名为custom_logger.rb的新初始值设定项;我们放置

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

然后,无论我们想在哪里使用信息,我们都会调用$INFO_LOGGER.info "Hello World,",这会打印

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

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

这个问题可以被认为是基于意见的,所以在我看来,我不建议这样做。此外,标题中提出的问题是关于自定义记录器的,虽然我们可以实现一个来促进请求,但我会提出一个更简单的解决方案,它仍然会将您想要的内容记录到当前日志文件中,并且不需要自定义记录器,辅助记录器或任何种类的全局变量。

我的建议:

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

如果有您一直想要记录的消息,而不管是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

您不希望使用全局变量。相反,创建一个自定义类,例如

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

相关内容

  • 没有找到相关文章

最新更新