set_uk has asked for the wisdom of the Perl Monks concerning the following question:

Recently I was able to locally name an unnamed sub using:-
local *__ANON__ = "_IterateChildren_CHILD";
This enabled Log4Perl to pick it up and use it when logging. I tried to implement the fix for naming an eval statement using the line directive - but I cant make it work. Anyone have any pointers.
eval { # line 23 "Name I want to call this eval" code here };

Replies are listed 'Best First'.
Re: Log4Perl Naming an Eval
by saintmike (Vicar) on Feb 03, 2004 at 00:19 UTC
    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.
      thanks will do
Re: Log4Perl Naming an Eval
by ysth (Canon) on Feb 03, 2004 at 00:15 UTC
    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.