Archived
1
0
Fork 0
This repository has been archived on 2021-10-08. You can view files and clone it, but you cannot make any changes to its state, such as pushing and creating new issues, pull requests or comments.
ACU/ACU/Log.pm
2013-09-15 22:30:27 +02:00

111 lines
2.5 KiB
Perl

package ACU::Log;
use v5.10.1;
use strict;
use warnings;
use Carp;
use Data::Dumper;
use Exporter 'import';
use POSIX qw(strftime);
use Term::ANSIColor qw(:constants);
use constant {
FATAL => 1,
ERROR2 => 2,
ERROR => 3,
WARN => 4,
DONE => 5,
USAGE => 6,
INFO => 7,
DEBUG => 8,
TRACE => 9,
};
our @EXPORT = qw(log FATAL ERROR2 ERROR WARN DONE USAGE INFO DEBUG TRACE);
our $display_level = 7;
our $save_level = 9;
our $fatal_error = 1;
our $fatal_warn = 0;
our $log_file = $0.".log";
my $log_fd;
sub log($@)
{
my $level = shift;
if ($#_ < 0) { return; }
if (!$_[0]) {
$Carp::Verbose = 1;
croak "Empty log message, this should not append!";
}
if (!$log_fd && $log_file) {
open ($log_fd, ">>", $log_file) or die("Unable to open log ($log_file) file for writing");
say $log_fd strftime("%a %b %e %H:%M:%S %Y", localtime), " START new logging session ";
}
if ($level <= $save_level and $log_fd)
{
local $| = 1;
print $log_fd strftime("%a %b %e %H:%M:%S %Y", localtime), " ", levelstr($level), " ";
if ($level >= TRACE) {
print $log_fd Dumper(@_);
}
else {
say $log_fd @_;
}
}
if ($level <= $display_level) {
say STDERR (leveldisp($level), @_, RESET);
}
if ($fatal_warn && $level <= WARN){
#TODO Thibaut
#log(INFO, "Program stopped due to warning");
exit 125;
}
elsif ($fatal_error && $level <= ERROR) {
#TODO Thibaut
#log(INFO, "Program stopped due to error");
exit 126;
}
elsif ($level <= FATAL) {
#TODO Thibaut
#log(INFO, "Program stopped due to fatal error");
exit 127;
}
}
sub levelstr($)
{
my $level = shift;
return "FATAL" if ($level == 1);
return "ERROR" if ($level == 3 or $level == 2);
return "WARN " if ($level == 4);
return "DONE " if ($level == 5);
return "USAGE" if ($level == 6);
return "INFO " if ($level == 7);
return "DEBUG" if ($level == 8);
return "TRACE";
}
sub leveldisp($)
{
my $level = shift;
return BOLD, ON_RED, YELLOW, "/!\\", RESET, " ", BOLD if ($level == 1);
return BOLD, ON_RED, ">>>", RESET, " ", BOLD if ($level == 2);
return BOLD, RED, ">>>", RESET, " ", BOLD if ($level == 3);
return BOLD, YELLOW, ">>>", RESET, " ", BOLD if ($level == 4);
return BOLD, GREEN, ">>>", RESET, " ", BOLD if ($level == 5);
return BOLD, MAGENTA, " * ", RESET, " ", BOLD if ($level == 6);
return BOLD, CYAN, " * ", RESET, " " if ($level == 7);
return BOLD, BLUE, " % ", RESET, " " if ($level == 8);
return BOLD, BLUE, "#", RESET, " ";
}
1;