I want to adopt logging within several utility classes, e. g. DBI. What is the best practice to do it with Log::Log4perl?
I think it is OK to subclass DBI (say, MyDBI
) and override some methods there to make them do the logging. But there's a problem with categories. If you create a logger with
Log::Log4perl->get_logger(ref $self || $self)
then all log entries belong to MyDBI
and it would be hard to filter them. So it seems better to me to pass a logger to MyDBI
from the calling module (say, MyModule
), so that category would be semantically right. The first question, is it OK in general? I mean, are there any hidden reefs regarding such approach?
The second question, how to pass the logger to MyDBI
? I have an idea to declare a global variable, e. g. $MyDBI::logger
and set in the calling method:
local $MyDBI::logger = Log::Log4perl->get_logger(ref $self || $self);
There's a traditional dislike for global variables. Can you think of a better way?
EDIT: Of course, the best code is no code. caller
would suffice, if it took inheritance into account.
The third question, is it possible to log into both categories, MyDBI
and MyModule
, with Log::Log4perl, if they are hierarchically unrelated?