首页 > 解决方案 > 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

标签: rubyloggingrspec

解决方案


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

接下来你要做的是找到一种方法来记住这个值,这样它就不会一遍又一遍地重新初始化。这超出了您的问题和此答案的范围,并且鉴于您的问题与您的回购协议之间的差异,我不想尝试修复您在原始问题中未明确描述的内容。祝你好运!


推荐阅读