首页 > 解决方案 > 如何将字符串作为方法传递?

问题描述

我有一种记录方法:

def logger(text, level = 'info')

   tagged_logger = Logger.new("log/#{Rails.env}.log")

   tagged_logger.level "#{text}"

end

正如您在方法中看到的,level默认值为'info',但也可以替换为'error', 'debug','fatal''unknown'

当我这样做时,记录器将工作:

tagged_logger.info "#{text}"    # It will log with 'INFO' tag

但我想把它放在一个方法中,这样我就可以在任何地方使用它。我想这样称呼它:

logger("File not found!", 'error')

但我想level在我的方法中替换为error(而不是作为字符串)。我希望它变成这样:

tagger_logger.error "#{text}"

任何人都可以帮助我吗?谢谢 :)

标签: ruby-on-railsrubylogging

解决方案


无需使用元编程(例如send),也无需冒调用意外方法的风险。相反,您可以使用Logger#add已经接受严重性作为其第一个参数的方法。

实际上,Logger#info, Logger#error, ... 方法只是在后台调用Logger#add的辅助方法。

如果您将消息严重性作为字符串获取,则可以使用Logger::SEV_LABEL来查找要传递给的正确数字严重性值Logger#add

TAGGED_LOGGER = Logger.new("log/#{Rails.env}.log")

def logger(text, level = "info")
  severity = Logger::SEV_LABEL.find_index(level.upcase)
  raise ArgumentError, "Unknown log level #{level} given" unless severity

  TAGGED_LOGGER.add(severity, text)
end

请注意,在代码中,我使用了全局定义的 Logger 实例。这通常是一种很好的做法,因为每次记录单个消息时创建一个新的 Logger 对象(并因此重新打开文件)可能相当浪费。


推荐阅读