Log-Deep
view release on metacpan or search on metacpan
lib/Log/Deep.pm view on Meta::CPAN
my $dump = $self->{dump};
# check that a session has been created
$self->session($data->{-session_id}) if !$self->{session_id};
my $level = $data->{-level} || '(none)';
delete $data->{-level};
my $configs = $data->{-write_configs};
delete $data->{-write_configs};
my $param = {
data => $data,
vars => $self->{vars},
};
# add all the config variables to the variables to be logged
if ($configs) {
for my $var ( keys %{ $self->{vars_config} } ) {
$param->{vars}{$var} = $self->{vars_config}{$var};
}
}
# set up
$param->{stack} = substr longmess, 0, 1_000;
$param->{stack} =~ s/^\s+[^\n]*Log::Deep::[^\n]*\n//gxms;
$param->{stack} =~ s/\A\s at [^\n]*\n\s+//gxms;
$param->{stack} =~ s/\n[^\n]+\Z/\n.../xms;
my @log = (
strftime('%Y-%m-%d %H:%M:%S', localtime),
$self->{session_id},
$level,
(join ' ', @message),
$dump->Data($param)->Out(),
);
# make each part safe for outputting to one line
for my $col (@log) {
chomp $col;
# quote all back slashes
$col =~ s{\\}{\\\\}g;
# quote all new lines
$col =~ s/\n/\\n/g;
}
my $log = $self->log_handle();
print {$log} join ',', @log;
print {$log} "\n";
$self->{log_session_count}++;
return ;
}
sub log_handle {
my $self = shift;
if ( !$self->{handle} ) {
$self->{log_dir} ||= $ENV{TMP} || '/tmp';
$self->{log_name} ||= (split m{/}, $0)[-1] || 'deep';
$self->{date_fmt} ||= '%Y-%m-%d';
$self->{log_date} = strftime $self->{date_fmt}, localtime;
my $file = $self->{file} || "$self->{log_dir}/$self->{log_name}_$self->{log_date}.log";
# guarentee that there is a new line before we start writing
my $missing = 0;
if ( !$self->{reopening} && -s $file ) {
open my $fh, '<', $file or die "Could not open the log file $file to check that it ends in a new line: $OS_ERROR\n";
seek $fh, -20, SEEK_END;
my $end = <$fh>;
$missing = $end =~ /\n$/;
close $fh;
}
open my $fh, '>>', $file or die "Could not open log file $file: $OS_ERROR\n";
$self->{file} = $file;
$self->{handle} = $fh;
if ($missing) {
print {$fh} "\n";
}
}
return $self->{handle};
}
sub session {
my ($self, $session_id) = @_;
if ( ! defined $session_id ) {
return if defined $self->{log_session_count} && $self->{log_session_count} == 0;
}
# use the supplied session id or create a new session id
$self->{session_id} = $session_id || int rand $self->{rand_max};
$self->record({ -write_configs => 1 }, '"START"');
$self->{log_session_count} = 0;
return;
}
sub level {
my ($self, @level) = @_;
$self->{level} ||= { map { $_ => 0 } @LOG_LEVELS };
# if not called with any parameters return the level hash
return clone $self->{level} if !@level;
# return log state if asked about that state
return $self->{level}{$level[1]} if $level[0] eq '-log';
# Set a log state if requested
return $self->{level}{$level[1]} = 1 if $level[0] eq '-set';
# Unset a log state if requested
return $self->{level}{$level[1]} = 0 if $level[0] eq '-unset';
( run in 0.785 second using v1.01-cache-2.11-cpan-71847e10f99 )