File Coverage

blib/lib/Log/Trivial.pm
Criterion Covered Total %
statement 95 105 90.4
branch 35 44 79.5
condition 13 14 92.8
subroutine 17 19 89.4
pod 9 9 100.0
total 169 191 88.4


line stmt bran cond sub pod time code
1             # $Id: Trivial.pm 61 2014-05-23 11:04:17Z adam $
2              
3             package Log::Trivial;
4              
5 8     8   223146 use 5.010;
  8         32  
  8         316  
6 8     8   9753 use utf8;
  8         95  
  8         46  
7 8     8   450 use strict;
  8         15  
  8         282  
8 8     8   40 use warnings;
  8         16  
  8         350  
9 8     8   68 use Fcntl qw(:DEFAULT :flock :seek);
  8         14  
  8         4869  
10 8     8   55 use Carp;
  8         22  
  8         20931  
11              
12             our $VERSION = '0.40';
13              
14             #
15             # NEW
16             #
17              
18             sub new {
19 8     8 1 7120 my $class = shift;
20 8         27 my %args = @_;
21 8   100     196 my $object = bless {
      100        
      100        
22             _log_tag => $args{log_tag}
23             || q{}, # Variable to tag this instance in the log file
24             _mode => 1, # File logging mode 1=multi thread, 0=single
25             _handle => undef, # File Handle if in single mode
26             _o_sync => 1, # Use POSIX O_SYNC for writing, 1=on (default), 0=off
27             _file => $args{log_file} || q{}, # The Log File
28             _level => $args{log_level} || '3', # Logging level
29             _error_message => q{}, # Store error messages here
30             _debug => undef, # debug flag
31             _no_date_tag => $args{no_date_tag} # Date tagging? (1=off, 0=on)
32             }, $class;
33              
34 8         29 return $object;
35             }
36              
37             sub set_log_file {
38 4     4 1 77 my $self = shift;
39 4         8 my $log_file = shift;
40 4 100       17 if ( $self->_check_file($log_file) ) {
41 2         5 $self->{_file} = $log_file;
42 2         5 $self->{_self} = 0;
43 2         7 return $self;
44             }
45             else {
46 2         11 return;
47             }
48             }
49              
50             sub set_log_mode {
51 4     4 1 11 my $self = shift;
52 4         9 my $mode = shift;
53              
54 4 100       20 if ( $mode =~ /m/imx ) {
55 2         5 $self->{_mode} = 1;
56             }
57             else {
58 2         8 $self->{_mode} = 0;
59             }
60              
61 4         19 return $self;
62             }
63              
64             sub set_log_level {
65 3     3 1 7 my $self = shift;
66 3         6 my $level = shift;
67              
68 3 100       14 $self->{_level} = $level if defined $level;
69              
70 3         12 return $self;
71             }
72              
73             sub set_write_mode {
74 3     3 1 423 my $self = shift;
75 3         5 my $mode = shift;
76              
77 3 100       14 if ( $mode =~ /s/imx ) {
78 1         6 $self->{_o_sync} = 1;
79             }
80             else {
81 2         10 $self->{_o_sync} = 0;
82             }
83 3         18 return $self;
84             }
85              
86             sub set_no_date_tag {
87 0     0 1 0 my $self = shift;
88 0         0 my $mode = shift;
89              
90 0 0       0 if ( $mode ) {
91 0         0 $self->{_no_date_tag} = 1;
92             }
93             else {
94 0         0 $self->{_no_date_tag} = 0;
95             }
96 0         0 return $self;
97             }
98              
99             sub mark {
100 0     0 1 0 my $self = shift;
101              
102 0         0 return $self->write( '-- MARK --' );
103             }
104              
105             sub write {
106 17     17 1 361 my $self = shift;
107 17         23 my $message;
108 17 100       41 if ( @_ > 1 ) {
109 12         43 my %args = @_;
110 12         19 my $level = $args{level};
111 12 100 100     86 return if $level && $self->{_level} < $level;
112 8   100     39 $message = $args{comment} || q{.};
113             }
114             else {
115 5         12 $message = shift;
116             }
117              
118 13 100       36 return $self->_raise_error( 'Nothing message sent to log' )
119             unless $message;
120              
121 12 100       39 $message = $self->{_log_tag} . "\t" . $message
122             if $self->{_log_tag};
123              
124 12 50       841 $message = localtime() . "\t" . $message
125             unless $self->{_no_date_tag};
126              
127 12         32 my $file = $self->{_file};
128 12 100       39 return $self->_raise_error( 'No Log file specified yet' ) unless $file;
129              
130 11 50 66     375 if ( -e $file && !-w _ ) {
131 0         0 return $self->_raise_error(
132             "Insufficient permissions to write to: $file" );
133             }
134              
135 11 100       31 if ( $self->{_mode} ) {
136 8         28 my $log = $self->_open_log_file( $file );
137 8 50       28 if ( $log ) {
138 8         29 $self->_write_log( $log, $message );
139 8         240 close $log;
140             }
141             else {
142 0         0 return $self->_raise_error( $self->get_error( ) );
143             }
144             }
145             else {
146 3 100       15 if ( !$self->{_handle} ) {
147 2         10 $self->{_handle} = $self->_open_log_file( $file );
148             }
149 3         14 $self->_write_log( $self->{_handle}, $message );
150             }
151 11         553 return $message;
152             }
153              
154             sub get_error {
155 4     4 1 1419 my $self = shift;
156 4         17 return $self->{_error_message};
157             }
158              
159             #
160             # Private Stuff
161             #
162              
163             sub _check_file {
164 4     4   7 my $self = shift;
165 4         6 my $file = shift;
166 4 100       18 return $self->_raise_error( 'File error: No file name supplied' )
167             unless $file;
168 2         6 return $self;
169             }
170              
171             sub _open_log_file {
172 10     10   14 my $self = shift;
173 10         72 my $file = shift;
174 10         14 my $log;
175              
176 10 100       23 if ( $self->{_o_sync} ) {
177 3 50       154 sysopen $log, $file, O_WRONLY | O_CREAT | O_SYNC | O_APPEND
178             or return $self->_raise_error( "Unable to open Log File: $file" );
179             }
180             else {
181 7 50       49045 sysopen $log, $file, O_WRONLY | O_CREAT | O_APPEND
182             or return $self->_raise_error( "Unable to open Log File: $file" );
183             }
184 10 50       96 flock $log, LOCK_EX
185             or return $self->_raise_error( "Unable to flock Log file: $file" );
186              
187 10         26 return $log;
188              
189             }
190              
191             sub _write_log {
192 11     11   20 my $self = shift;
193 11         14 my $handle = shift;
194 11         26 my $string = shift() . "\n";
195              
196 11         21 my $bytes = length $string;
197 11         44 sysseek $handle, 0, SEEK_END;
198 11         163839 syswrite $handle, $string, $bytes;
199 11 50       67 return $self->_raise_error( 'Write Error' ) unless $bytes == length $string;
200 11         37 return $bytes;
201             }
202              
203             sub _raise_error {
204 4     4   8 my $self = shift;
205 4         5 my $message = shift;
206 4 100       49 carp $message if $self->{_debug}; # DEBUG: warn with the message
207 4         1153 $self->{_error_message} = $message; # NORMAL: set the message
208 4         19 return;
209             }
210              
211             1;
212              
213             __END__