ruby - RSpec:从命令行提供日志级别
问题描述
我logging
从本教程中学到了https://www.scalyr.com/blog/getting-started-quickly-ruby-logging/
我添加了以下功能spec_helper.rb
def logger(message)
logger = Logger.new File.new('example.log', 'w')
logger.info message
end
高级 rspec sample_spec.rb
require_relative 'spec_helper'
describe 'test_feature' do
it 'test_case_1' do
expect(20).to be > 19
logger.info '*********** Test Passed ***************'
end
it 'test_case_2' do
expect(21).to be < 19
logger.error '*********** Test Failed ***************'
end
end
它生成example.log
错误
NoMethodError:
undefined method `info' for 1:Integer
但我希望文件和控制台中的日志都可以灵活地在命令行定义日志级别。
我怎样才能做到这一点?这是最小的可重现示例https://github.com/jeevan1987cool/sample-rspec-logging
解决方案
感谢您制作示例项目。这有帮助。您是否注意到logger
您在 repo 中logger
定义的方法与您在问题中定义的方法不同?
从你的问题:
def logger(message)
logger = Logger.new File.new('example.log', 'w')
logger.info message
end
从你的回购:
def logger
logger = Logger.new File.new('example.log', 'w')
logger.level = Logger::INFO
end
假设您打算使用存储库中的方法定义(因为您的问题中的方法生成ArgumentError: wrong number of arguments (given 0, expected 1)
),问题是该方法的最后一行是:
logger.level = Logger::INFO
此调用返回1
,因为它是方法中的最后一行,成为该方法的默认返回值。
您可能打算logger
像这样返回对象:
def logger
logger = Logger.new File.new('example.log', 'w')
logger.level = Logger::INFO
logger
end
这将返回如下内容:
=> #<Logger:0x00007ffe0a32b300
@default_formatter=#<Logger::Formatter:0x00007ffe0a32a888 @datetime_format=nil>,
@formatter=nil,
@level=1,
@logdev=
#<Logger::LogDevice:0x00007ffe0a32a130
@dev=#<File:example.log>,
@filename=nil,
@mon_count=0,
@mon_mutex=#<Thread::Mutex:0x00007ffe0a329b90>,
@mon_mutex_owner_object_id=70364534755480,
@mon_owner=nil,
@shift_age=nil,
@shift_period_suffix=nil,
@shift_size=nil>,
@progname=nil>
它还将成功地将信息记录到example.log
.
话虽如此,它可能不会按照您期望的方式运行:每次调用都会logger
通过调用重新初始化对象Logger.new File.new('example.log', 'w')
,并且File.new
在w
模式下调用将覆盖任何现有文件。因此,调用logger
两次意味着您将写入example.log
然后再次覆盖其内容。您可以在 Ruby 文档中阅读有关IO 开放模式的更多信息。所以你要做的第一件事就是修复你的打开模式。
接下来你要做的是找到一种方法来记住这个值,这样它就不会一遍又一遍地重新初始化。这超出了您的问题和此答案的范围,并且鉴于您的问题与您的回购协议之间的差异,我不想尝试修复您在原始问题中未明确描述的内容。祝你好运!
推荐阅读
- shopify - 如何更改订单项 ID - Shopify Ajax 购物车
- python - 如何正确地将多个子列添加到熊猫数据框 - KeyError
- python-3.x - 这是一个简单的python装箱单
- java - 针对计算机的井字游戏简单代码 - 主要问题
- c++ - 孙子的复制构造函数导致祖父的 std::optional 成员的默认赋值运算符被删除
- jackson - 忽略使用 Jackson CSV 解析 CSV 文件的特定列
- c# - 单击 asp.net 按钮无法将行添加到表中
- asp.net-mvc - 我有模型值并希望在 @Html.DropDownList 或 @Html.DropDownListFor 中显示
- c++ - 有没有办法使用 C++ 中的函数来定义对象?
- testing - 在多种语言上运行相同的测试套件(本地化)