ruby-on-rails - 如何将字符串作为方法传递?
问题描述
我有一种记录方法:
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}"
任何人都可以帮助我吗?谢谢 :)
解决方案
无需使用元编程(例如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 对象(并因此重新打开文件)可能相当浪费。
推荐阅读
- php - 检查当前日期是否是 PHP 中的周末总是失败
- javascript - 显示时间,但根据位置进行更改
- r - R中两个数字(范围)之间的所有小数点后两位的浮点数
- python - 无法将边添加到 networkx 图
- javascript - Highcharts饼图在刷新时失去颜色
- python-3.x - 如何在熊猫中为不存在的条目创建新行
- visual-studio-code - CMake 找不到 OPENMP(Mingw,Win10,VSCODE)
- java - 无法读取控制台值 Java
- mysql - 如何将现有数据库上传到cpanel?
- java - 特定模块的 JMX spring 配置