Добрый день, уважаемое сообщество.
Заметка не претендует на истину в последней инстанции, это всего лишь способ поделиться полученным опытом.
В общем, как-то появилась необходимость в одном проекте (проект на Rails 3.2) писать в production лог имя класса и метода, в котором был вызван логгер. Необходимо для того, чтобы после было понятно в каком классе и методе класса ошибка.
Есть тонкость: класс, в котором вызыван логгер — свой, и не наследуется ни от ApplicationController ни от ActiveRecord.
А нужно было получить что-то типа:
Конструкции вроде
нужного результата не давали.
Погуглив была найдена вот такая статья в которой описано как такие вещи делаются.
Итогом явилось вот такое решение:
environment.rb:
Конечно, решение имеет свои минусы:
Буду рад дополнениям и предложениям.
Спасибо!
Заметка не претендует на истину в последней инстанции, это всего лишь способ поделиться полученным опытом.
В общем, как-то появилась необходимость в одном проекте (проект на 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
- произойдёт ещё что-то, о чём я сейчас не вспомнил
Буду рад дополнениям и предложениям.
Спасибо!