File Coverage

blib/lib/Armadito/Agent/Logger/File.pm
Criterion Covered Total %
statement 18 44 40.9
branch 0 14 0.0
condition 0 9 0.0
subroutine 6 8 75.0
pod 2 2 100.0
total 26 77 33.7


line stmt bran cond sub pod time code
1             package Armadito::Agent::Logger::File;
2              
3 1     1   10825523 use strict;
  1         2  
  1         59  
4 1     1   15 use warnings;
  1         2  
  1         62  
5 1     1   13 use base 'Armadito::Agent::Logger::Backend';
  1         46  
  1         493  
6              
7 1     1   4 use English qw(-no_match_vars);
  1         1  
  1         19  
8 1     1   648 use Fcntl qw(:flock);
  1         1  
  1         196  
9 1     1   485 use File::stat;
  1         5175  
  1         3  
10              
11             sub new {
12 0     0 1   my ( $class, %params ) = @_;
13              
14             my $self = {
15             logfile => $params{config}->{logfile},
16             logfile_maxsize => $params{config}->{'logfile-maxsize'}
17 0 0         ? $params{config}->{'logfile-maxsize'} * 1024 * 1024
18             : 0
19             };
20 0           bless $self, $class;
21              
22 0           return $self;
23             }
24              
25             sub addMessage {
26 0     0 1   my ( $self, %params ) = @_;
27              
28 0           my $level = $params{level};
29 0           my $message = $params{message};
30              
31 0           my $handle;
32 0 0         if ( $self->{logfile_maxsize} ) {
33 0           my $stat = stat( $self->{logfile} );
34 0 0 0       if ( $stat && $stat->size() > $self->{logfile_maxsize} ) {
35 0 0         if ( !open $handle, '>', $self->{logfile} ) {
36 0           warn "Can't open $self->{logfile}: $ERRNO";
37 0           return;
38             }
39             }
40             }
41              
42 0 0 0       if ( !$handle && !open $handle, '>>', $self->{logfile} ) {
43 0           warn "can't open $self->{logfile}: $ERRNO";
44 0           return;
45             }
46              
47 0           my $locked;
48 0           my $retryTill = time + 60;
49              
50 0   0       while ( $retryTill > time && !$locked ) {
51             ## no critic (ProhibitBitwise)
52             # get an exclusive lock on log file
53 0 0         $locked = 1 if flock( $handle, LOCK_EX | LOCK_NB );
54             }
55              
56 0 0         if ( !$locked ) {
57 0           die "can't get an exclusive lock on $self->{logfile}: $ERRNO";
58             }
59              
60 0           print {$handle} "[" . localtime() . "]" . "[$level]" . " $message\n";
  0            
61              
62             # closing handle release the lock automatically
63 0           close $handle;
64              
65             }
66              
67             1;
68             __END__
69              
70             =head1 NAME
71              
72             Armadito::Agent::Logger::File - A file backend for the logger
73              
74             =head1 DESCRIPTION
75              
76             This is a file-based backend for the logger. It supports automatic filesize
77             limitation.