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

Hi Monks,

I am trying to add current localtime to each line in the log file. The option that i got now is to format the print statement as follows:

sub current_time { ... return $formatted_time; } print current_time . "$message\n";

The above method is fine, but has two issues. One, if the message is of multiple lines, time will be added to only the first line. Two, everytime when print is required, the format has to be changed to subroutine,"message". This applies to all 'die', 'croak' and unhandled system exceptions.

As I have learned, it is not possible to override Perl print function to add custom parameter. What can be done to get the log to printed in below format.

2013-04-10 10:23:01,967 Hash Dumper is: 2013-04-10 10:23:01,967 $VAR1 = { 2013-04-10 10:23:01,967 'c' => 'd', 2013-04-10 10:23:01,967 'a' => 'b' 2013-04-10 10:23:01,967 }; 2013-04-10 10:23:01,967 Single line message 2013-04-10 10:23:03,354 DEBUG test end

Any suggestion is appreciated

Replies are listed 'Best First'.
Re: Appending time to each line
by BrowserUk (Patriarch) on May 21, 2013 at 09:42 UTC

    Use your datetime function in place of localtime:

    $text = "the\nquick\nbrown\nfox\n";; $text = join "\n", map{ localtime()." $_" } split "\n", $text;; print $text;; Tue May 21 10:42:09 2013 the Tue May 21 10:42:09 2013 quick Tue May 21 10:42:09 2013 brown Tue May 21 10:42:09 2013 fox

    With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
    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.
Re: Appending time to each line
by Corion (Patriarch) on May 21, 2013 at 09:47 UTC

    You can simply replace each beginning of the line with the timestamp:

    $message=~ s!^!$timestamp !mg;
      Thanks for the reply.. But how could I print date for Data::Dumper output in each line as shown in the example?

        First capture the Data::Dumper output in a string, then prepend the timestamp:

        my $message= Dumper $myvar; $message=~ s!^!$timestamp !mg; print $message;

        See the Data::Dumper $Data::Dumper::Pad configuration variable.

        --MidLifeXis

        IMHO, it would make sense to encapsulate everything in a subroutine along the lines of

        use strict; use warnings; sub tprint { my $msg = join $,//'' ,@_; my $tstamp = localtime()." "; $msg =~ s/^/$tstamp/gm; print $msg; } tprint "something\nelse\n";

        BUT to completely replicate the interface of the print function is beyond my Perl skills. I have no idea how one could now provide a file handle to print into file.

Re: Appending time to each line
by hdb (Monsignor) on May 21, 2013 at 09:11 UTC

    If you replace all \n in $message with "\n".current_time you should get the desired output. A trailing \n needs to be exempted.