Hi all
I am normally using the following line to capture the die output into a logfile.
INIT {$SIG{__DIE__}=sub {LOG_MSG("normal",3,"GENERAL","Script died: $_[0]") and close LOG;}}
Now I am using also Getopt::Long. I don't want to have a logfile generated if somebody is chosing the wrong parameter. Therefore I let the script die with an usage output.
Unfortunately if somebody choses a wrong getopt parameter now - I get a log error message because of the INIT-"die" setting as the log file is not opened yet.
Example:
G:\development\bin>x.pl -x
> 4,GENERAL,Script warning: Unknown option: x
print() on unopened filehandle LOG at G:\development\bin\x.pl line 45.
+ ###
Version:2.0.0
NAME xxx
> 3,GENERAL,Script died: 1 at G:\development\bin\x.pl line 14. ###
> 4,GENERAL,Script warning: print() on unopened filehandle LOG at G:\d
+evelopment\bin\x.pl line 45. ###
print() on unopened filehandle LOG at G:\development\bin\x.pl line 45.
+ ###
1 at G:\development\bin\x.pl line 14. ###
G:\development\bin>
Every line marked with "###" at the end I do not want to have as output to STDOUT.
Do you have an ideas how can fix it? Thanks.
kind regards
de Michi
Code:
use strict;
use warnings;
use Getopt::Long qw(:config no_ignore_case bundling); # Get options /
my $VERSION = "2.0.0";
INIT {$SIG{__DIE__}=sub {LOG_MSG("normal",3,"GENERAL","Script died: $_
+[0]") and close LOG;}}
INIT {$SIG{__WARN__}=sub {LOG_MSG("normal",4,"GENERAL","Script warning
+: $_[0]")}}
# Check Flags
my $flag_help;
my $flag_version;
my $flag_config;
GetOptions (
'h|help' => \$flag_help,
'V|VER' => \$flag_version,
'c|config=s' => \$flag_config,
) or die USAGE();
# Check flags and print usage
if ($flag_version)
{
print "Version: $VERSION\n";
exit;
}
if ($flag_help)
{
USAGE();
exit;
}
open(LOG,"> SCRIPTLOG_FILE") or die ("Can't open SCRIPTLOG_FILE: $!\n"
+);
close LOG;
### subs
sub LOG_MSG
{
my $par_LEVEL = shift (@_);
my $par_SEVERITY = shift (@_);
my $par_FUNCTION = shift (@_);
my @line = @_;
print "> $par_SEVERITY,$par_FUNCTION,@line\n";
print LOG "$par_SEVERITY,$par_FUNCTION,@line\n";
}
sub USAGE
{
my ($message)=<<'MESSAGE';
NAME xxx
MESSAGE
print "Version:${VERSION}\n$message";
}