Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW
 
PerlMonks  

Log4Perl Naming an Eval

by set_uk (Pilgrim)
on Feb 02, 2004 at 22:30 UTC ( [id://326040]=perlquestion: print w/replies, xml ) Need Help??

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.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://326040]
Approved by jweed
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others sharing their wisdom with the Monastery: (4)
As of 2024-03-28 23:26 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found