3
0
mirror of https://github.com/pragma-/pbot.git synced 2024-12-25 20:22:37 +01:00
pbot/PBot/Logger.pm

55 lines
1.6 KiB
Perl

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
package PBot::Logger;
use parent 'PBot::Class';
use warnings; use strict;
use feature 'unicode_strings';
use Scalar::Util qw/openhandle/;
use File::Basename;
sub initialize {
my ($self, %conf) = @_;
$self->{logfile} = $conf{filename} // Carp::croak "Missing logfile parameter in " . __FILE__;
$self->{start} = time;
my $path = dirname $self->{logfile};
if (not -d $path) {
print "Creating new logfile path: $path\n";
mkdir $path or Carp::croak "Couldn't create logfile path: $!\n";
}
open LOGFILE, ">>$self->{logfile}" or Carp::croak "Couldn't open logfile $self->{logfile}: $!\n";
LOGFILE->autoflush(1);
$self->{pbot}->{atexit}->register(sub { $self->rotate_log; return; });
return $self;
}
sub log {
my ($self, $text) = @_;
my $time = localtime;
$text =~ s/(\P{PosixGraph})/my $ch = $1; if ($ch =~ m{[\s]}) { $ch } else { sprintf "\\x%02X", ord $ch }/ge;
print LOGFILE "$time :: $text" if openhandle *LOGFILE;
print "$time :: $text";
}
sub rotate_log {
my ($self) = @_;
my $time = localtime $self->{start};
$time =~ s/\s+/_/g;
# logfile has to be closed first for maximum compatibility with `rename`
close LOGFILE;
rename $self->{logfile}, $self->{logfile} . '-' . $time;
# reopen renamed logfile to resume any needed logging
open LOGFILE, ">>$self->{logfile}-$time" or Carp::carp "Couldn't re-open logfile $self->{logfile}-$time: $!\n";
LOGFILE->autoflush(1) if openhandle *LOGFILE;
}
1;