У нас есть код для регистрации данных в нашем веб-приложении Ruby 1.8.6. Вы называете это примерно так:
$log.info("Some text here")
Теперь, в журнале я хотел бы включить модуль, где появилась эта строка. Я знаю, что Kernel#caller
даст мне массив, где я могу извлечь файл и номер строки, в которой произошла строка журнала, но я этого не хочу. Я хочу модуль, а не имя файла. Очевидное решение состоит в том, чтобы изменить строку журнала так, чтобы она читалась следующим образом:
$log.info("Some text here", self.class.name)
и затем проанализируйте результат. Это не сработает, потому что я пытаюсь извлечь эту информацию в случае по умолчанию. То есть мне нужно, чтобы решение работало, если программист забыл указать модуль, второй параметр в строке журнала.
Есть ли способ сделать это? Если нет, мне просто нужно обойтись с массивом caller
; большинство наших модулей находятся в отдельных каталогах, так что это будет решение на 80%.
Более полный пример, прошу прощения за незначительные синтаксические ошибки:
в файле log.rb:
module Log
class Logger
def info(msg, mod = '')
puts "Module: #{mod} Msg: #{msg}"
end
end # class Logger
end # module Log
$log = Log::Logger.new
в файле foo.rb:
module Foo
class Bar
def do_something
# Do not pass in self.class.name.
# We want the output to look like:
# Module: Foo Msg: I did something!
$log.info "I did something!"
end
end # class Bar
end #module Foo