-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathlogger.pm
47 lines (38 loc) · 835 Bytes
/
logger.pm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package logger;
use warnings;
use strict;
our $file = 'var/log';
our $MAX_FILES = 9;
our $fh;
sub rotate {
rename "$file.$_", "$file." . ($_ + 1)
for reverse 1..$MAX_FILES-1;
close $fh if $fh;
rename $file, "$file.1";
open $fh, '>', $file
or die "open $file: $!";
select $fh; $|++; select STDOUT;
$! = 0;
tie *STDERR, __PACKAGE__;
warn "log rotated at ${\scalar localtime}\n";
}
sub TIEHANDLE { bless {} }
sub PRINT {
my (undef, $msg) = @_;
$msg =~ s/\n\z//;
$msg .= " errno=$!(" . int ($!) . ')', $! = 0 if $!;
my ($s, $m, $h) = localtime;
printf { $fh || *STDERR } "%02d:%02d:%02d %s %s \n",
$h, $m, $s, (caller 1)[3] || '?', $msg;
}
sub trace {
my ($msg) = @_;
my $i = 1;
while (caller $i) {
my @c = caller $i++;
print STDERR "trace: $c[3] at $c[1]:$c[2]";
}
print STDERR $msg;
exit 1;
}
1;