Logger-Simple
view release on metacpan or search on metacpan
use Object::InsideOut;
$ms=750_000;
$VERSION='2.0';
$SEM = ".LS.lock";
$SEMAPHORE=new FileHandle;
$FILEHANDLE=new FileHandle;
@HISTORY=();
my @Log :Field('Standard'=>'Log','Type'=>'LIST');
my @FileHandle :Field('Standard'=>'FileHandle','Type'=>'SCALAR');
my @Semaphore :Field('Standard'=>'Semaphore','Type'=>'SCALAR');
my @Error :Field('Standard'=>'Error','Type'=>'LIST');
my %init_args :InitArgs=(
'Log'=>{
'Regex' => qr/^Log$/i,
'Mandatory' => 1,
},
);
sub _init :Init{
my($self,$args)= @_;
if(exists($args->{'Log'})){
$self->set(\@Log,$args->{'Log'});
}
$self->set(\@FileHandle,$FILEHANDLE);
$self->set(\@Semaphore,$SEMAPHORE);
$self->open_log;
}
sub open_log{
my $self=shift;
my $FH=$self->get_FileHandle;
my $Log=$self->get_Log;
if(! open($FH,">>$Log")){
$self->write_error("Unable to open logfile\n");
return 0;
}
$FH->autoflush(1);
return 1;
}
sub write{
my($self,$msg)=@_;
my $FH=$self->get_FileHandle;
my $format="$0 : [".scalar (localtime)."] $msg";
## Fix to ignore locking on Win32
if($^O eq "MSWin32"){}else{
$self->lock();
}
if(! print $FH "$format\n"){
croak "Unable to write to log file: $!\n";
}
if($^O eq "MSWin32"){}else{
$self->unlock();
}
$self->update_history($msg);
}
sub update_history{
my($self,$msg)=@_;
push @HISTORY,$msg;
}
sub retrieve_history{
my $self=shift;
if(wantarray){
return @HISTORY;
}else{
my $message=$HISTORY[$#HISTORY];
return $message;
}
}
sub lock{
my $self=shift;
if($^O eq "MSWin32"){ return 1; }
my $SM=$self->get_Semaphore;
open $SM,">$SEM"||die"Can't create lock file: $!\n";
flock($SM,LOCK_EX) or die"Can't obtain file lock: $!\n";
}
sub unlock{
my $self=shift;
my $SM=$self->get_Semaphore;
if(-e $SEM){
flock($SM,LOCK_UN);
close $SM;
$SM->autoflush(1);
if($^O eq "MSWin32"){
system "C:\\Windows\\System32\\cmd.exe \/c del $SEM";
}else{
unlink $SEM;
}
}
}
sub wait{
while(-e $SEM){
usleep $ms;
}
}
sub clear_history{
my $self=shift;
@HISTORY=();
}
}
1;
__END__
=head1 NAME
Logger::Simple - Implementation of the Simran-Log-Log and Simran-Error-Error modules
=head1 SYNOPSIS
use Logger::Simple;
my $log=Logger::Simple->new(LOG=>"/tmp/program.log");
my $x=5;my $y=4;
( run in 0.581 second using v1.01-cache-2.11-cpan-39bf76dae61 )