package Logger::Simple; use strict; use Carp; use FileHandle; use Fcntl qw(:flock); use vars qw /$VERSION $SEM/; $VERSION='1.06'; $SEM = ".LS.lock"; sub new{ my($class,%args)=@_; my $self = bless{LOG => $args{LOG} || croak"No logfile!\n", CARP => $args{CARP} || undef, FILEHANDLE => new FileHandle || croak"Unable to get filehandle\n", SEMAPHORE => new FileHandle || croak"Unable to create semaphore filehandle\n", ERROR => "", HISTORY => [], },$class; if(! $self->open()){ die"Unable to open $self->{LOG}\n"; } return $self; } sub open{ my $self=shift; if(! open($$self{FILEHANDLE},">>$$self{LOG}")){ $self->set("Unable to open logfile\n"); return 0; } $$self{FILEHANDLE}->autoflush(1); return 1; } sub write{ my($self,$msg)=@_; my $FH=*{$$self{FILEHANDLE}}; my $format="$0 : [".scalar (localtime)."] $msg"; $self->lock(); if(! print $FH "$format\n"){ $self->set("Unable to write to $$self{LOG}: $!\n"); } $self->unlock(); } sub message{ my $self=shift; if(wantarray){ my @messages=@{$$self{HISTORY}}; return @messages; }else{ my $message=$$self{ERROR}; return $message; } } sub clear{ my $self=shift; $$self{ERROR}=undef; } sub set{ my ($self,$error)=@_; $self->clear; $$self{ERROR}=$error; push @{$$self{HISTORY}},$error; carp "$error\n" if $$self{CARP}; $self->write($error); } sub print_object{ require Data::Dumper; my $self=shift; print Data::Dumper->Dumper($self); } sub lock{ my $self=shift; my $FH=*{$$self{SEMAPHORE}}; if(-e $SEM){ flock($FH,LOCK_NB) or carp"Can't obtain file lock: $!\n"; open($FH,">$SEM")||die"Can't create lock file: $!\n"; flock($FH,LOCK_EX) or die"Can't obtain file lock: $!\n"; }else{ open $FH,">$SEM"||die"Can't create lock file: $!\n"; flock($FH,LOCK_EX) or die"Can't obtain file lock: $!\n"; } } sub unlock{ my $self=shift; my $FH=*{$$self{SEMAPHORE}}; if(-e $SEM){ flock(S,LOCK_UN); close S; unlink $SEM; } } 1;