There are some good answers here so far, but I'd like to recommend a logging module like Log::Log4perl. If your script is more than a run-once throwaway, proper logging will almost certainly be of benefit.

Metacpan: https://metacpan.org/module/Log::Log4perl
FAQ: http://log4perl.sourceforge.net/releases/Log-Log4perl/docs/html/Log/Log4perl/FAQ.html
Tutorial: http://www.perl.com/pub/2002/09/11/log4perl.html

To log to two files:

#!/usr/bin/perl

use strict;
use warnings;

use Log::Log4perl qw(get_logger);

# Normally this would be in a separate file
my $log4perl_cfg = <<'EOCFG';
# Two appenders in our logger tmplog1 & tmplog2
log4perl.logger = DEBUG, tmplog1, tmplog2

log4perl.appender.tmplog1 = Log::Log4perl::Appender::File
log4perl.appender.tmplog1.filename = /var/tmp/one.log
log4perl.appender.tmplog1.layout   = PatternLayout
log4perl.appender.tmplog1.layout.ConversionPattern = %d> %m%n

log4perl.appender.tmplog2 = Log::Log4perl::Appender::File
log4perl.appender.tmplog2.filename = /var/tmp/two.log
log4perl.appender.tmplog2.layout   = PatternLayout
log4perl.appender.tmplog2.layout.ConversionPattern = %d> %m%n
EOCFG

Log::Log4perl->init( \$log4perl_cfg );
my $logger = get_logger();
my $rsync = 'rsync';

$logger->debug('About to rsync');
...;
$logger->info("kdkdkdkd Output from: $rsync cmdflgs");
exit 0;

Using Log4perl allows you to change how you log very easily, with appenders for output to files, the screen, databases etc. all available. The configuration format is somewhat verbose, so I generally use the Template Toolkit to generate it for me. The example below solves your same problem, but for N files instead of two:

#!/usr/bin/perl

use strict;
use warnings;

use Log::Log4perl qw(get_logger);
use Template;

my $logging_cfg_template = <<'EOCFG';
[% BLOCK appenders -%]
[% FOR section IN sections %][% section.log_appender_name %][% ", " UNLESS loop.last %][% END %]
[%- END %]
[% BLOCK appender_sections %]
  [% FOR section IN sections %]
log4perl.appender.[% section.log_appender_name %] = Log::Log4perl::Appender::File log4perl.appender.[% section.log_appender_name %].filename = [% section.log_file_name %]
log4perl.appender.[% section.log_appender_name %].layout = PatternLayout
log4perl.appender.[% section.log_appender_name %].layout.ConversionPattern = %d> %m%n
  [% END %]
[% END %]
log4perl.logger = DEBUG, [% PROCESS appenders %]
[% PROCESS appender_sections %]
EOCFG

my $template = {
    sections => [
{ log_appender_name => 'tmplog1', log_file_name => '/var/log/one.log', }, { log_appender_name => 'tmplog2', log_file_name => '/var/log/two.log', }, { log_appender_name => 'tmplog3', log_file_name => '/var/log/three.log', },
    ],
};

my $tt = Template->new();

my $log4perl_cfg;
$tt->process( \$logging_cfg_template, $template, \$log4perl_cfg ) || die 'Template error: ' . $tt->error();

# Comment or remove this line once you are happy with the generated config
print "CONFIG: $log4perl_cfg\n";

Log::Log4perl->init( \$log4perl_cfg );
my $logger = get_logger('main');
my $rsync  = 'rsync';

$logger->info("kdkdkdkd Output from: $rsync cmdflgs");

Cheers,
Michael


On 08/28/2013 06:44 AM, Harry Putnam wrote:
I happen to be scripting something that needs to have two logs written
to and was sort of taken by how awkward this construction looked:

(Simplified for discussion, from a longer script)

   my $rsync = 'rsync';
   my $tmplog = 'one.log';
   my $tmplog2 = 'two.log';
   open(LOG,">>$tmplog")or die "Can't open $tmplog : $!";
   open(LOG2,">>$tmplog2")or die "Can't open $tmplog2: $!";
   print LOG  "kdkdkdkd Output from:\n$rsync cmdflgs";
   print LOG2 "kdkdkdkd Output from:\n$rsync cmdflgs"
   close(LOG);
   close(LOG2);

Is there some smooth way to write to more than one log?

I tried just adding the second one to the first print like this:

  print LOG LOG2 "[...]";

   But that fails with an error:

   String found where operator expected at ./t1.pl line 109, near "LOG2
   "kdkdkdkd Output from:\n$rsync cmdflgs""

         (Do you need to predeclare LOG2?)

   syntax error at ./t1.pl line 109, near "LOG2 "kdkdkdkd Output
   from:\n$rsync cmdflgs""

   Execution of ./t1.pl aborted due to compilation errors.



--
Michael Brader                    Senior Software Engineer and Perl Person
Our World Wide Web has a World Wide Network      Technology/Softdev/DevOps
Internode       http://internode.on.net/          mbra...@internode.com.au
iiNet             http://iinet.net.au/         m.bra...@staff.iinet.net.au


--
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to