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