Я хочу использовать протоколирование в нескольких служебных классах, e. г. DBI. Как лучше всего делать это с Log :: Log4perl?
Я думаю, что это нормально для подкласса DBI (скажем, MyDBI
) и переопределить некоторые методы там, чтобы заставить их делать регистрацию. Но есть проблема с категориями. Если вы создаете регистратор с
Log::Log4perl->get_logger(ref $self || $self)
тогда все записи журнала принадлежат MyDBI
, и их будет сложно отфильтровать. Поэтому, мне кажется, лучше передать регистратор в MyDBI
из вызывающего модуля (скажем, MyModule
), чтобы эта категория была семантически правильной. Первый вопрос, нормально ли это вообще? Я имею в виду, есть ли скрытые подводные камни в отношении такого подхода?
Второй вопрос, как передать регистратор на MyDBI
? У меня есть идея объявить глобальную переменную, т.е. г. $MyDBI::logger
и установить в методе вызова:
local $MyDBI::logger = Log::Log4perl->get_logger(ref $self || $self);
Существует традиционная неприязнь к глобальным переменным. Вы можете придумать лучший способ?
РЕДАКТИРОВАТЬ: Конечно, лучший код не код. caller
будет достаточно, если принять во внимание наследование.
Третий вопрос, возможно ли войти в обе категории, MyDBI
и MyModule
, с помощью Log :: Log4perl, если они иерархически не связаны?