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/