RSpe c: обеспечить уровень журнала из командной строки - PullRequest
0 голосов
/ 02 мая 2020

Я узнал 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

высокий уровень rspe c sample_spe c .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

1 Ответ

0 голосов
/ 03 мая 2020

Спасибо за создание примера проекта. Это помогло. Вы заметили, что метод logger, который вы определили в своем репо, отличается от метода logger, который вы определили в своем вопросе?

Из вашего вопроса:

def logger(message)
  logger = Logger.new File.new('example.log', 'w')
  logger.info message
end

Из вашего repo:

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, а затем перезапишите его содержимое. Подробнее о IO Open Modes вы можете прочитать в Ruby документах. Поэтому первое, что вы захотите сделать, это исправить свой режим открытия.

Следующее, что вы захотите сделать, - это найти способ запомнить это значение, чтобы оно не переинициализировалось снова и снова , Это выходит за рамки вашего вопроса и этого ответа, и учитывая несоответствие между вашим вопросом и вашим репо, я бы предпочел не пытаться исправить то, что вы явно не описали в своем первоначальном вопросе. Удачи!

...