File Coverage

blib/lib/FusionInventory/Agent/Logger/File.pm
Criterion Covered Total %
statement 39 44 88.6
branch 10 14 71.4
condition 7 9 77.7
subroutine 8 8 100.0
pod 2 2 100.0
total 66 77 85.7


line stmt bran cond sub pod time code
1             package FusionInventory::Agent::Logger::File;
2              
3 2     2   26451472 use strict;
  2         18  
  2         131  
4 2     2   26 use warnings;
  2         4  
  2         170  
5 2     2   14 use base 'FusionInventory::Agent::Logger::Backend';
  2         138  
  2         1359  
6              
7 2     2   14 use English qw(-no_match_vars);
  2         3  
  2         52  
8 2     2   2126 use Fcntl qw(:flock);
  2         6  
  2         540  
9 2     2   1625 use File::stat;
  2         10312  
  2         15  
10              
11             sub new {
12 5     5 1 14 my ($class, %params) = @_;
13              
14             my $self = {
15             logfile => $params{config}->{logfile},
16             logfile_maxsize => $params{config}->{'logfile-maxsize'} ?
17 5 100       31 $params{config}->{'logfile-maxsize'} * 1024 * 1024 : 0
18             };
19 5         12 bless $self, $class;
20              
21 5         91 return $self;
22             }
23              
24             sub addMessage {
25 2053     2053 1 5311 my ($self, %params) = @_;
26              
27 2053         3144 my $level = $params{level};
28 2053         3067 my $message = $params{message};
29              
30 2053         2496 my $handle;
31 2053 100       5057 if ($self->{logfile_maxsize}) {
32 1024         2857 my $stat = stat($self->{logfile});
33 1024 100 100     147099 if ($stat && $stat->size() > $self->{logfile_maxsize}) {
34 1 50       1416 if (!open $handle, '>', $self->{logfile}) {
35 0         0 warn "Can't open $self->{logfile}: $ERRNO";
36 0         0 return;
37             }
38             }
39             }
40              
41 2053 50 66     79917 if (!$handle && !open $handle, '>>', $self->{logfile}) {
42 0         0 warn "can't open $self->{logfile}: $ERRNO";
43 0         0 return;
44             }
45              
46 2053         2974 my $locked;
47 2053         3363 my $retryTill = time + 60;
48              
49 2053   66     10095 while ($retryTill > time && !$locked) {
50             ## no critic (ProhibitBitwise)
51             # get an exclusive lock on log file
52 2053 50       18148 $locked = 1 if flock($handle, LOCK_EX|LOCK_NB);
53             }
54              
55 2053 50       4127 if (!$locked) {
56 0         0 die "can't get an exclusive lock on $self->{logfile}: $ERRNO";
57             }
58              
59 2053         2714 print {$handle}
  2053         46288  
60             "[". localtime() ."]" .
61             "[$level]" .
62             " $message\n";
63              
64             # closing handle release the lock automatically
65 2053         165374 close $handle;
66              
67             }
68              
69             1;
70             __END__