我学会了 logging
从本教程 https:/www.scalyr.combloggetting-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.comjeevan1987coolsample-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
假设你的意思是使用你的repo中的方法定义(因为你的问题中的方法会产生)。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
然后再次覆盖其内容。你可以阅读更多关于 IO开放模式 在Ruby文档中。所以你要做的第一件事就是修正你的打开模式。
接下来你要做的是找到一种方法来记忆这个值,这样它就不会一次又一次地被重新初始化。这超出了你的问题和这个答案的范围,而且考虑到你的问题和你的repo之间的差异,我宁愿不尝试修复你在原始问题中没有明确描述的东西。祝您好运!