RSpec:从命令行提供日志级别。

问题描述 投票:0回答:1

我学会了 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。

ruby logging rspec
1个回答
0
投票

谢谢你做的示例项目。这对你有帮助。你有没有注意到 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.neww 模式将覆盖任何现有文件。因此,调用 logger 两次意味着你会写 example.log 然后再次覆盖其内容。你可以阅读更多关于 IO开放模式 在Ruby文档中。所以你要做的第一件事就是修正你的打开模式。

接下来你要做的是找到一种方法来记忆这个值,这样它就不会一次又一次地被重新初始化。这超出了你的问题和这个答案的范围,而且考虑到你的问题和你的repo之间的差异,我宁愿不尝试修复你在原始问题中没有明确描述的东西。祝您好运!

© www.soinside.com 2019 - 2024. All rights reserved.