Logger-Simple

 view release on metacpan or  search on metacpan

Simple.pm  view on Meta::CPAN

  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 )