Добрый день, уважаемое сообщество.
Заметка не претендует на истину в последней инстанции, это всего лишь способ поделиться полученным опытом.

В общем, как-то появилась необходимость в одном проекте (проект на Rails 3.2) писать в production лог имя класса и метода, в котором был вызван логгер. Необходимо для того, чтобы после было понятно в каком классе и методе класса ошибка.
Есть тонкость: класс, в котором вызыван логгер — свой, и не наследуется ни от ApplicationController ни от ActiveRecord.

А нужно было получить что-то типа:
2014-06-24 10:16:31 INFO SMARTCHEQUE(perform_psp_query) -- response: #<Net::HTTPOK 200 OK readbody=true>



Конструкции вроде
config.log_tags = [lambda{| req | __method__}]

нужного результата не давали.

Погуглив была найдена вот такая статья в которой описано как такие вещи делаются.
Итогом явилось вот такое решение:

environment.rb:
class Logger
  def format_message(severity, time, progname, msg)
    element = caller[4].split("/").last unless caller.nil?
    caller_class_name = element ? element.scan(/^[a-z]+/).first.upcase : "UNDEFINED"
    caller_method_name = element ? element.scan(/`(.+)'$/)[0].last.downcase : "undefined"
    "#{time.to_s(:db)} #{severity} #{caller_class_name}(#{caller_method_name}) -- #{msg}\n"
  end
end


Конечно, решение имеет свои минусы:
  • случится страшное и нужной информации не окажется в caller[4]
  • изменится поведение метода caller
  • произойдёт ещё что-то, о чём я сейчас не вспомнил


Буду рад дополнениям и предложениям.
Спасибо!