If configured with PatternLayout, Log::Log4perl will use Perl's
caller($depth) function internally to obtain the name of the
function/method where the logging statement is located in at runtime.
Since caller($depth) returns "(eval)" as the
subroutine name if you're within an eval {}, Log::Log4perl will
display "(eval)".
There's a nasty trick you could use to bump up the caller level and
have it return the calling function:
use Log::Log4perl qw(:easy);
Log::Log4perl->easy_init(
{ level => $DEBUG,
layout => "%M: %m%n",
});
foo();
sub foo {
eval {
local $Log::Log4perl::caller_depth =
$Log::Log4perl::caller_depth + 1;
DEBUG("I'm here!");
};
}
This will print
main::foo: I'm here!
as expected. However, there's several things to consider:
-
Don't forget to set back the caller level to the previous value when
you're exiting the eval {} construct (the 'local' takes care of that).
-
This will only go back one level. If you've got nested eval's, it's
not going to go up to the calling function.
- Not only the reported function name will be affected this way, but also items like the line number (%L) or file name (%F) will reflect the location of the calling function, not the Log::Log4perl logger call.
-
It's not really clean for the application to fiddle around with
Log::Log4perl's internals. The next version of Log::Log4perl is
rumoured (mutter, mutter, ...) to take care of this issue
automagically.
Check the log4perl-devel@lists.sourceforge.net mailing list for updates.
| [reply] [Watch: Dir/Any] [d/l] [select] |
The #line technique you are trying to use is best used with the string form of eval (eval EXPR, not eval BLOCK). What you have should work in the eval, but the #line setting will continue even after the end of the eval. Do you really need to fool perl within the eval BLOCK? It should correctly report the actual file name and line number. | [reply] [Watch: Dir/Any] |