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

I created a logging sub, which I call from many other subs. I would like it to reference the sub name it is being called under. Is there a special variable for this? Thanks!

Replies are listed 'Best First'.
Re: Reference sub name
by ikegami (Patriarch) on Jul 27, 2008 at 07:47 UTC
Re: Reference sub name
by martin (Friar) on Jul 27, 2008 at 10:10 UTC
    The caller function will let you do that.

    Example:

    sub foo { my $calling_sub = (caller 1)[3]; $calling_sub = 'the main block' if !defined $calling_sub; print "called from: $calling_sub\n"; } sub bar { foo(); } bar(); # prints: called from: main::bar foo(); # prints: called from: the main block

    Personally, when I need additional log information depending on context, I prefer to use explicit parameters for the logging function. This way, I have more control on the logging protocol, and the individual context tags at each logger call make it easy to map log messages back to the related pieces of code without exposing program internals in the logs. I do not depend on a one-to-one relationship between subroutine names and things worth while to log, either.

    Example:

    # using Sys::Syslog log levels sub open_db { my $dbname = shift; # ... if (defined $dbh) { log_this(LOG_NOTICE, 'OPEN_DB', $dbname, 'db connection establ +ished'); } else { log_this(LOG_ERR, 'OPEN_DB_NOK', $dbname, 'db connection faile +d'); } }
      ... without exposing program internals in the logs.

      Why? Who is reading your logs and what do you think that they might discover?

      (That they could just as easily discover by reading the sources which they presumably would also have access to.)


      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.
        Exposing internals, in some cases, is not only a matter of secrecy. If your logs are not mainly intended for the purpose of debugging code, but for keeping track of any kind of events, internals might be irrelevant, needlessly verbose, and inconveniently varying with software versions. In any case simpler log file contents make log file evaluation simpler.

        The original post mentioned a logging interface already being in place, which supports the notion of a more general attitude.

Re: Reference sub name
by rovf (Priest) on Jul 28, 2008 at 08:31 UTC
    In addition to the already suggested solution involving caller, did you consider Log::Log4Perl, which (depending on your actual logging needs) might already solve automatically what you are looking for.
    -- 
    Ronald Fischer <ynnor@mm.st>